观察者模式
定义对象间一种一对多的依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新
核心概念
- Observer 观察者接口 将多个订阅者称为观察者
- ConcreteObserver 观察者具体实现对象
- Subject 目标对象 多个观察者观察的对象被称为目标
- ConcreteSubject 具体的目标实现对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
public interface Observer {
void update(Subject subject); }
public class ConcreteObserver implements Observer{
@Override public void update(Subject subject) {
System.out.println("目标有改动,需要进行处理");
} }
public class Subject { private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer){ observers.add(observer); }
public void detach(Observer observer){ observers.remove(observer); }
public void notifyObservers(){ for(Observer observer : observers){ observer.update(this); } } }
public class ConcreteSubject extends Subject{
private int state;
public int getState() { return state; }
public void setState(int state) { this.state = state; this.notifyObservers(); } }
|
优缺点
优点
- 实现了观察者和目标之间的抽象耦合
- 实现了动态联动
- 支持广播通信
缺点
使用场景
- 当有两个方面,且一个方面依赖于另一个方面的状态变化
- 在更改一个对象时,需要连带着改变其他对象,且不知道有多少对象需要被连带改变
- 当一个对象必须通知其他的对象,但又希望这个对象和其他被通知的对象是松耦合的