- 介绍:
观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时GUI系统需要一套机制来应对这种情况,是的UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了。
- 定义:
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
- 使用场景:
- 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
- 事件多级触发场景
- 跨系统的消息交换场景,如消息队列、事件总线的处理机制
- 代码实现:
三个类:Subscriber(消息订阅者/观察者) DtPublicNumber(dt公众号/被观察者) Test(测试类)
package dreamtech.mode.observe;
import java.util.Observable;
import java.util.Observer;
public class Subscriber implements Observer {
public String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Observable info : " + o.toString());
System.out.println("Hi, " + name + ", dtPublicNumber has updated, content: " + arg);
}
}
package dreamtech.mode.observe;
import java.util.Observable;
public class DtPublicNumber extends Observable {
public void postNewPublication(String content) {
setChanged();
notifyObservers(content);
}
}
package dreamtech.mode.observe;
public class Test {
public static void main(String[] args) {
DtPublicNumber dt = new DtPublicNumber();
Subscriber subscriber1 = new Subscriber("Yiqing Xu");
Subscriber subscriber2 = new Subscriber("Tianyi Zhang");
Subscriber subscriber3 = new Subscriber("Zewang Chen");
dt.addObserver(subscriber1);
dt.addObserver(subscriber2);
dt.addObserver(subscriber3);
dt.postNewPublication("dt is ready to recruit new members");
}
}
输出
Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Zewang Chen, dtPublicNumber has updated, content: dt is ready to recruit new members
Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Tianyi Zhang, dtPublicNumber has updated, content: dt is ready to recruit new members
Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Yiqing Xu, dtPublicNumber has updated, content: dt is ready to recruit new members