观察者模式

总结解决、解耦的钥匙-观察者模式

模式简介

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

使用场景

  1. 关联行为场景,需要注意的是,关联行为是可以拆分的,而不是组合关系;
  2. 事件多级触发场景;
  3. 跨系统的消息交换场景,如消息队列、事件总线的处理机制;

简单实现

观察者

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package ObserverMode;
import java.util.Observable;
import java.util.Observer;
public class Coder implements Observer {
private String name;
public Coder(String name) {
    this.name = name;
}
public void update(Observable o, Object arg) {
    System.out.println("hi"+name+"更新了,内容"+arg);
}
@Override
public String toString() {
    return "Coder{" +
            "name='" + name + '\'' +
            '}';
}
}

被观察者

1
2
3
4
5
6
7
8
package ObserverMode;
import java.util.Observable;
public class DevTechFrontier extends Observable {
    public void postNewPublication(String content){
        setChanged();
        notifyObservers(content);
    }
}

测试代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package ObserverMode;
public class Test {
public static void main(String[] args) {
    DevTechFrontier devTechFrontier=new DevTechFrontier();
        Coder coder=new Coder("coder");
        Coder coder1=new Coder("coder1");
        Coder coder2=new Coder("coder2");
        Coder coder3=new Coder("coder3");
        devTechFrontier.addObserver(coder);
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);
        devTechFrontier.addObserver(coder3);
        devTechFrontier.postNewPublication("新一期的周报发布了");
    }
}

执行结果

ObserverMode.png

优点:

  1. 观察者与被观察者之间是抽象耦合,应对业务变化
  2. 增强系统灵活性、可拓展性

缺点:

​ 在应用观察者模式是需要考虑一下开发效率以及运行效率的问题,程序中包括一个被观察者,多个观察者、开发和调试等内容会比较复杂,而且在java中消息的通知默认是顺序执行,一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般考虑采用异步的方式。