观察者设计模式
说明
- 观察者模式也称作监听模式,即观察与被观察的关系,比如你在烧开水时看它有没有开,你就是观察者,水就是被观察者。观察者模式是指对象之间一对多的依赖关系,每当那个被观察者改变状态时,所有依赖于它的观察者都会得到通知并被自动更新
- 观察者模式是对象的行为模式。有的地方称作的发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式等,当你看到这种叫法时,不要觉得陌生,它们都是观察者模式。
- 观察者模式可以有任意多个观察者对象同时监听某一个对象。监听某个对象的叫观察者(Observer),被监听的对象叫被观察者(Subject) 。被观察者对象在内容或状态发生改变时,会通知所有观察者,使它们能自动更新自己的信息。
架构
- Observer:所有的观察者接口
- Subject:被观察者接口
- update方法为被观察者更新
- addObserver方法为添加新的观察者
- delObserver方法为移除某个观察者
具体代码实现
public class ObserverImplA implements Observer{
@Override
public void update(Subject subject) {
System.out.println("观察者A执行");
}
}
public class ObserverImplB implements Observer{
@Override
public void update(Subject subject) {
System.out.println("观察者B执行");
}
}
public class SubjectImpl implements Subject {
private List<Observer> observers;
@Override
public void update() {
System.out.println("被观察者执行");
if (observers == null) {
return;
}
for (Observer observer : observers) {
observer.update(this);
}
}
@Override
public void addObserver(Observer observer) {
if (observers == null) {
observers = new LinkedList<>();
}
observers.add(observer);
}
@Override
public void delObserver(Observer observer) {
if (observers == null || observers.isEmpty()) {
return;
}
observers.remove(observer);
}
}
public static void main(String[] args) {
final Subject subject = new SubjectImpl();
// 新增两个观察者
subject.addObserver(new ObserverImplA());
subject.addObserver(new ObserverImplB());
// 修改被观察者
subject.update();
// 被观察者发生变化时,两个观察者也会一同发生变化
}