一、引言
下面来介绍一下观察者设计模式。观察者设计模式,顾名思义,肯定要有一个观察者,一个被观察者,而他们之间的关系应当是聚合,即你中有我,我中有你。这样在被观察者改变的时候,观察者才能感知事务被改变,从而得到通知。
二、观察者设计模式定义一个被观察者:Subject
被观察者中,拥有一个观察者的集合,当对象被改变时,调用观察者集合,做通知处理。
定义一个观察者:Observer
观察者中,拥有被观察者的引用,方便获得被观察者中的具体改变。
1. 被观察者public class Subject {
//持有一系列观察者的集合
private List observers = new ArrayList();
//被观察者的状态
private int state;
public int getState() {
return this.state;
}
public void setState(int state) {
if (state == this.state) {
return;
}
this.state = state;
//状态改变时,通知所有的观察者
notifyAllObserver();
}
//添加观察者
public void attach(Observer observer) {
observers.add(observer);
}
//通知所有的观察者
private void notifyAllObserver() {
observers.stream().forEach(Observer::update);
}
}
2. 观察者的父类
public abstract class Observer {
protected Subject subject; // 被观察者
public Observer(Subject subject) {
this.subject = subject;
this.subject.attach(this); // 将自己加入观察者集合中
}
//抽象方法,具体实现交给子类,模板方法的运用
public abstract void update();
}
3. 观察者的具体实现
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Binary String:"+ Integer.toBinaryString(subject.getState()));
}
}
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Octal String:" + Integer.toOctalString(subject.getState()));
}
}
4. 测试方法
public class ObserverClient {
public static void main(String[] args) {
final Subject subject = new Subject();// 被观察者
new BinaryObserver(subject); // 定义观察者的同时,把自己加入到观察者集合中
new OctalObserver(subject);
System.out.println("==================");
subject.setState(10);
System.out.println("==================");
subject.setState(10);
System.out.println("==================");
subject.setState(15);
}
}
5. 输出结果
本文用最通俗的语言介绍了观察者设计模式,鄙人认为比起介绍类图来的更直接,也更容易理解。上面就是观察者设计模式的核心思想。下次使用可以灵活变通。
可能有人会觉得奇怪,为什么要setState(10)两次?这是可以优化的地方,在每次改变之前,比较当前值,不一样再进行改变,在平时的开发中,也可以借鉴。