设计模式 - 浅谈观察者模式
观察者模式
模式功能说明:让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
模式思路与原理
观察者模式的主要角色有两种:观察者(Observer)
和被观察者(Subject)
。被观察者持有观察者的集合,当被观察者的状态发生变化时,会通知所有的观察者。
代码示例
import java.util.ArrayList;
import java.util.List;
// 被观察者
class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
public void notifyObservers(String newState){
for(Observer observer : observers){
observer.update(newState);
}
}
}
// 观察者
interface Observer {
public void update(String state);
}
class ConcreteObserver implements Observer {
private String observerState;
@Override
public void update(String state) {
observerState = state;
System.out.println("状态为:"+observerState);
}
}
Subject
是被观察者,它持有一组观察者,当它的状态发生变化时,会通知所有的观察者。ConcreteObserver
是具体的观察者,当接收到被观察者的通知时,会更新自己的状态。
使用场景:
- 观察者模式常用于实现事件处理系统,消息推送系统,数据同步等场景。
优缺点
优点:
- 观察者和被观察者之间是抽象耦合关系,符合依赖倒置原则。
- 观察者模式支持广播通信。
缺点:
- 如果一个被观察者对象有很多的直接和间接的观察者,将所有的观察者都通知到会花费很多时间。
- 如果在观察者和被观察者之间存在循环依赖,可能导致系统崩溃。
- 观察者只知道被观察者发生了改变,但是不知道是怎么发生变化的。
总结
观察者模式实现了设计原则中的“开闭原则”,即对扩展开放,对修改关闭。当我们需要增加新的观察者时,只需要实现Observer接口即可,无需修改Subject的代码。 观察者模式实现了低耦合,非侵入式的通知与更新机制。