一. 概念Observer(觀察者模式):定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新。
二. 角色抽象主題(Subject)角色:主題角色把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)聚集里,每個(gè)主題都可以有任何數(shù)量的觀察者。 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。 具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。 具體觀察者(ConcreteObserver)角色:存儲(chǔ)與主題的狀態(tài)自恰的狀態(tài)。
三. 實(shí)現(xiàn)由于java提供了觀察者模式的實(shí)現(xiàn),這里就直接使用java的Api來(lái)實(shí)現(xiàn),這里模擬家長(zhǎng)對(duì)孩子下達(dá)命令。
Test.java
public static void main(String[] args) { Children c1 = new Children(m); Children c2 = new Children(m); m.setInfo("快去寫(xiě)作業(yè)!"); m.setInfo("快去寫(xiě)作業(yè)!"); m.setInfo("快去睡覺(jué) !"); 這里Mother是具體主題角色,Children是具體觀察者角色。
Children.java public class Children implements Observer {
public Children(Mother m){ m.addObserver(this); } @Override public void update(Observable o, Object arg) { String info = ((Mother)o).getInfo(); System.out.println("已經(jīng)收到命令:" + info); }
} 實(shí)現(xiàn)了Observer接口,是具體觀察者角色。
Mother.java public class Mother extends Observable { private String info = "";
public String getInfo() { return info; }
public void setInfo(String info) { if(!this.info.equals(info)){ this.info = info; setChanged(); } notifyObservers(); } } 繼承了Observalbe類,是具體主題角色。
|