软件体系结构-观察者模式

定义

定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。

UML类图

四个部分:

  • Subject抽象目标
  • ConcreteSubject具体目标
  • Observer观察者接口
  • ConcreteObserver具体观察者

代码

抽象目标

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Subject{
protected ArrayList<Observer> observers = new ArrayList<>();

public void attach(Observer observer){
observers.add(observer);
}

public void detach(Observer observer){
observers.remove(observer);
}

public abstract void notify();
}

具体目标

1
2
3
4
5
6
7
public class ConcreteSubject extends Subject{
public void notify(){
for(Object obs: observers){
((Observer)obs).update();
}
}
}

抽象观察者

1
2
3
public interface Observer {
public void update();
}

具体观察者

1
2
3
4
5
public class ConcreteObserver implements Observer{
public void update(){
具体业务
}
}

优点

  • 可以实现表示层和数据逻辑层的分离
  • 在观察目标和观察者之间建立一个抽象的耦合
  • 支持广播通信,简化了一对多系统设计的难度
  • 符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便

缺点

  • 将所有的观察者都通知到会花费很多时间
  • 如果存在循环依赖时可能导致系统崩溃
  • 没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知道观察目标发生了变化

适用

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用
  • 一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁
  • 需要在系统中创建一个触发链