1. 定义
定义了对象之间一对多的依赖,当一个对象改变状态时,它的依赖者会收到通知并自动更新。
2. 角色
- Subject:目标
- ConcreteSubject:具体目标
- Observer:观察者
- ConcreteObserver:具体观察者
3. 特点
- 优点:实现了发布者和订阅者的耦合。
- 缺点:如果订阅者过多的话,发布通知会花费很多时间。
4. 示例
Subject:
public abstract class Subject {
public List<Observer> list;
public Subject() {
list = new LinkedList<>();
}
public void attach(Observer observer) {
list.add(observer);
}
public void detach(Observer observer) {
list.remove(observer);
}
public abstract void update();
}
ConcreteSubject:
public class ConcreteSubject extends Subject {
@Override
public void update() {
System.out.println("notify observers");
for (Observer observer : list) {
observer.update();
}
}
}
Observer:
public interface Observer {
public void update();
}
具体观察者:
// ConcreteObserverA
public class ConcreteObserverA implements Observer {
@Override
public void update() {
System.out.println("Observer A updates");
}
}
// ConcreteObserverB
public class ConcreteObserverB implements Observer {
@Override
public void update() {
System.out.println("Observer B updates");
}
}
测试类:
public class TestObserver {
public static void main(String[] args) {
Observer observerA = new ConcreteObserverA();
Observer observerB = new ConcreteObServerB();
Subject subject = new ConcreteSubject();
subject.attach(observerA);
subject.attach(observerB);
subject.update();
}
}
// 输出
// notify observers
// Observer A updates
// Observer B updates
参考:
1. 《Head First 设计模式》
2. 《图说设计模式》https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html