定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
解决的问题
对象A(主题)有数据,对象BCD依赖于A的数据,当A的数据有状态变化时,BCD需要及时知道。
使用到的原则
- 松耦合,当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
类图
image.png描述
- 定义主题接口Subject,三个方法,注册、删除和通知状态更新观察者。
- 定义观察者接口Observer,一个方法,update,表示接受主题状态更新。
- SomeSubject是Subject的具体实现,实现了三个接口方法。
- ObserverSubclass1和ObserverSubclass2都实现了Observer接口,是两个观察者。二者都保留了Subject的引用,用于获取状态更新getStatusMsg()。
伪代码
主题接口
public interface Subject{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyChanges();
}
观察者接口
public interface Obsever{
public void update();
}
主题的具体实现
public class SomeSubject implements Subject{
private ArrayList observers;
public SomeSubject(){
observers = new ArrayList();
}
public void registerObserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
int i = observers.indexOf(o);
if(i>=0){
observers.remove(i);
}
}
public void notifyChanges(){
for(int i=0;i<observers.length();i++){
Observer o = observers[i];
o.update();
}
}
public StatusMsg getStatusMsg(){
return msg;
}
public void statusChange(){
notifyChanges();
}
}
观察者的一个具体实现
public class ObserverSubclass1 implements Observer{
private Subject subject;
public ObserverSubclass1(Subject s){
this.subject = s;
s.registObserver(this);// 将观察者添加进观察者列表
}
public void update(){
toDo();
}
public void toDo(){
SomeSubject ss = (SomeSubject)subject;
StatusMsg sm = ss.getStatusMsg();// 获取状态变化信息
System.out.println(sm.toString());
}
}
示例
SomeSubject ss = new SomeSubject();//定义主题
ObserverSubclass1 os1 = new ObserverSubclass1(ss);//创建观察者1,并注册
ObserverSubclass2 os2 = new ObserverSubclass2(ss);//创建观察者2,并注册
ss.statusChange();// 主题状态变化,通知到os1 os2
ss.statusChange();// 主题状态再次变化,通知到os1 os2
一句话总结
我订阅了你,你变化了,你要告诉我。
网友评论