总结解决、解耦的钥匙-观察者模式
模式简介
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
使用场景
- 关联行为场景,需要注意的是,关联行为是可以拆分的,而不是组合关系;
- 事件多级触发场景;
- 跨系统的消息交换场景,如消息队列、事件总线的处理机制;
简单实现
观察者
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("新一期的周报发布了");
}
}
|
执行结果
优点:
- 观察者与被观察者之间是抽象耦合,应对业务变化
- 增强系统灵活性、可拓展性
缺点:
在应用观察者模式是需要考虑一下开发效率以及运行效率的问题,程序中包括一个被观察者,多个观察者、开发和调试等内容会比较复杂,而且在java中消息的通知默认是顺序执行,一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般考虑采用异步的方式。