观察者模式
内容参考 w3cschool
分类:行为型设计模式
应用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
目录
UML类图
创建观察者抽象类 和 主题
Observer
public abstract class Observer {
protected Subject subject;
/**
* 更新主题
*/
public abstract void update();
}
Subject
public class Subject {
private List<Observer> observerList = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observerList.add(observer);
}
public void notifyAllObservers(){
for (Observer observer:observerList){
observer.update();
}
}
}
创建观察者
BinaryObserver
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.printf("[Binary] %s\n",Integer.toBinaryString(subject.getState()));
}
}
OctalObserver
public class OctalObserver extends Observer{
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.printf("[Binary] %s\n",Integer.toOctalString(subject.getState()));
}
}
HexObserver
public class HexObserver extends Observer{
public HexObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.printf("[Binary] %s\n",Integer.toHexString(subject.getState()));
}
}
运行测试
public class ExecuteMain {
public static void main(String[] args) {
Subject subject = new Subject();
new HexObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state Change :15");
subject.setState(15);
System.out.println("\nSecond state Change :10");
subject.setState(10);
}
}
First state Change :15
[Binary] f
[Binary] 17
[Binary] 1111
Second state Change :10
[Binary] a
[Binary] 12
[Binary] 1010
Process finished with exit code 0