觀察者模式定義了對象間一對多的關係,當一個對象狀態發生變化時,全部依賴於該對象的對象也將發生變化。html
例如須要顯示一個數字(Subject)的十進制(Observer )和二進制(Observer ),當這個數發生變化時,對應顯示的十進制和二進制數也要發生變化。java
這就可使用觀察者模式,顯示十進制數和二進制數依賴於具體的數字,當具體數字發生變化時,依賴對象也發生變化。ide
Subjectthis
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) {//添加依賴對象(2、十進制顯示) this.observers.add(observer); } public void notifyAllObserver() {//通知全部Observer更新 for(Observer observer : observers) { observer.update(); } } }
Observerspa
Observer是依賴於Subject的對象,當Subject發生變化時,依賴的Observer也發生變化。code
public abstract class Observer { protected Subject subject;//Observer依賴的對象 public abstract void update();//Observer更新 }
二進制顯示(Observer)server
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)htm
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
參考資料:blog