观察者模式
定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新.
使用场景:
- 关联行为场景. 需要注意的是,关联行为是可以拆分的,而不是"组合"关系.
- 事件多级触发场景.
- 跨系统的消息交换场景. 如消息队列,事件总线的处理机制.
优点: 观察者和被观察者之间是抽象耦合,应对业务变化. 增强系统灵活性,可扩展性.
缺点: 在使用时应该考虑一下开发效率和运行效率.程序中包含一个被观察者,多个观察者,开发和调试等内容会比较复杂,而且在 Java 中消息的通知默认是顺序执行的,一个观察者卡顿,会影响整体的执行效率,这种情况下,一般采用异步的方式.
举个例子:
//程序员是观察者
public class Coder implements Observer {
private String name;
public Coder(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Hi, "+ name+", DEvTechFrontier 更新啦,内容是 "+arg);
}
@Override
public String toString() {
return "码农 : "+name;
}
}
/**
* DevTechFrontier 开发技术前线,这个网站就被观察者角色,当它更新时所有的
* 观察者都会收到相应的通知.
* */
public class DevTechFrontier extends Observable{
public void postNewFeed(String content){
//标识状态或者内容发生变化.
setChanged();
//通知所有观察者
notifyObservers(content);
}
}
public static void main(String[] args) {
//被观察者角色
DevTechFrontier devTechFrontier = new DevTechFrontier();
//观察者
Coder mrsimple = new Coder("mr.simple");
Coder coder1 = new Coder("code-1");
Coder coder2 = new Coder("code-2");
Coder coder3 = new Coder("code-3");
devTechFrontier.addObserver(mrsimple);
devTechFrontier.addObserver(coder1);
devTechFrontier.addObserver(coder2);
devTechFrontier.addObserver(coder3);
devTechFrontier.postNewFeed("新一期的内容更新啦");
}
打印出来结果:
Hi, code-3, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, code-2, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, code-1, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, mr.simple, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
能看出来通知顺序是,后添加进去的先通知到.