观察者模式定义了对象间一对多的关系,当一个对象状态发生变化时,所有依赖于该对象的对象也将发生变化。
例如需要显示一个数字(Subject)的十进制(Observer )和二进制(Observer ),当这个数发生变化时,对应显示的十进制和二进制数也要发生变化。
这就可以使用观察者模式,显示十进制数和二进制数依赖于具体的数字,当具体数字发生变化时,依赖对象也发生变化。
Subject
import java.util.ArrayList; import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state;//具体的数字 public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObserver();//更新具体数字时同时通知Observer更新状态 } public void attach(Observer observer) {//添加依赖对象(二、十进制显示) this.observers.add(observer); } public void notifyAllObserver() {//通知所有Observer更新 for(Observer observer : observers) { observer.update(); } } }
Observer
Observer是依赖于Subject的对象,当Subject发生变化时,依赖的Observer也发生变化。
public abstract class Observer { protected Subject subject;//Observer依赖的对象 public abstract void update();//Observer更新 }
二进制显示(Observer)
public class BinaryObserver extends Observer{ public BinaryObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。 this.subject = subject; this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers
}
@Override
public void update() { //subject发生变化,调用notifyAllObsever时更新显示数据
System.out.println("BinaryObserver:" + Integer.toBinaryString(subject.getState()));
}
}
十进制显示(Observer)
public class OctalObserver extends Observer{ public OctalObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。 this.subject = subject; this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers } @Override public void update() {//subject发生变化,调用notifyAllObsever时更新显示数据 System.out.println("OctalObserver:" + subject.getState()); } }
Main
public class Main { public static void main(String[] args) { //创建subject,Observer依赖于subject,subject发生变化时,observer同时发生变化 Subject subject = new Subject(); //将object与subject绑定 new BinaryObserver(subject); new OctalObserver(subject); //subject发生变化时,object同时发生变化 subject.setState(10); subject.setState(20); } }
运行结果:
BinaryObserver:1010 OctalObserver:10 BinaryObserver:10100 OctalObserver:20
参考资料: