您的位置:首页 > 其它

观察者模式(Observer Pattern)

2016-05-31 23:52 393 查看
观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。



下面举一个具体例子:



两个观察者,BinaryObserver的update将setState传入的整数转换成二进制,OctaObserver则是转成八进制

interfaceSubject{

privateList<Observer>observers;

publicvoidregisterObserver(Observero);

publicvoidremoveObserver(Observero);

publicvoidnotifyAllObservers();
}


publicclassConcreteSubjectimplementsSubject{

privateList<Observer>observers
=newArrayList<Observer>();
privateintstate;

publicintgetState(){
returnstate;
}

publicvoidsetState(intstate){
this.state=state;
notifyAllObservers();
}

publicvoidregisterObserver(Observerobserver){
observers.add(observer);
}

publicvoidremoveObserver(Observerobserver){
inti=observers.indexOf(observer);
if(i>=0)
observers.remove(i);
}

publicvoidnotifyAllObservers(){
for(Observerobserver:observers){
observer.update();
}
}
}


abstractObserver{
publicabstractvoidupdate();
}




publicclassBinaryObserverimplementsObserver{
 Subjectsubject;
publicBinaryObserver(Subjectsubject){
this.subject=subject;
this.subject.attach(this);
}

@Override
publicvoidupdate(){
System.out.println("BinaryString:"
+Integer.toBinaryString(subject.getState()));
}
}


publicclassOctalObserverimplementsObserver{
Subjectsubject;
publicOctalObserver(Subjectsubject){
this.subject=subject;
this.subject.attach(this);
}

@Override
publicvoidupdate(){
System.out.println("OctalString:"
+Integer.toOctalString(subject.getState()));
}
}


测试代码:

Subjectsubject=newConcreteSubject();
Observero=newOctalObserver(subject);
Observerb=newBinaryObserver(subject);

subject.registerObserver(o);
subject.registerObserver(b);
subject.setState(15);
subject.setState(10);


在Swing中有使用到观察者模式,比如JButton的addActionListener方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: