Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式。
下面是一个观察者模式的简单案例。
Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口。BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口。
Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者。
代码实现
Observer 接口,定义了被通知的方法,定义了观察的对象。
public abstract class Observer { protected Subject subject; public abstract void update(int value);
}
BinaryObserver, OctalObserver, HexaObserver 实现了 Observer 接口,实现了具体的被通知方法。
public class BinaryObserver extends Observer { public BinaryObserver(Subject subject){
this.subject = subject;
subject.attach(this);
} @Override
public void update(int value) {
System.out.println("BinaryObserver " + Integer.toString(value, 2));
}
}
public class OctalObserver extends Observer { public OctalObserver(Subject subject){
this.subject = subject;
subject.attach(this);
} @Override
public void update(int value) {
System.out.println("octal Observer update " + Integer.toString(value, 8));
}
}
public class HexaObserver extends Observer { public HexaObserver(Subject subject){
this.subject = subject;
subject.attach(this);
} @Override
public void update(int value) {
System.out.println("hexa Observer update " + Integer.toString(value, 16));
}
}
Subject 是被观察的对象,内含一个观察本对象的观察者名单
public class Subject { private List<Observer> observers = new LinkedList<>(); private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state;
this.notifyAllObservers();
} public void attach(Observer observer){
observers.add(observer);
} public void notifyAllObservers(){
for (Observer observer : observers){
observer.update(state);
}
}
}
演示代码,每次更新 Subject 对象的属性,Subject 都会通知到观察它的观察者
public class ObserverPatternDemo { public static void main(){ Subject subject = new Subject(); new BinaryObserver(subject);
new OctalObserver(subject);
new HexaObserver(subject); subject.setState(17);
subject.setState(9);
}
}
参考资料