Java設(shè)計(jì)模式分析之觀(guān)察者
大小:0.3 MB 人氣: 2017-09-26 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶(hù)評(píng)論(0)
標(biāo)簽:JAVA(102450)
觀(guān)察者模式的流程跟報(bào)紙訂閱方式一致,即:觀(guān)察者模式=出版者+訂閱者,只是名稱(chēng)不一樣,出版者改稱(chēng)為“主題”(Subject),訂閱者改稱(chēng)為“觀(guān)察者”(Observer)。觀(guān)察者定義:
觀(guān)察者模式定義了對(duì)象之間的一對(duì)多依賴(lài),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴(lài)者都會(huì)受到通知并自動(dòng)更新。
主題接口(Subject):對(duì)象使用此接口注冊(cè)為觀(guān)察者,或者把自己從觀(guān)察者中刪除。
具體主題(ConcreteSubject):一個(gè)具體主題總是實(shí)現(xiàn)主題接口,除了注冊(cè)*和撤銷(xiāo)方法以外,具體主題還實(shí)現(xiàn)了notifyObserves()方法,此方法用于在狀態(tài)改變時(shí)更新所有當(dāng)前觀(guān)察者。
觀(guān)察者(Observer):為那些在目標(biāo)發(fā)生改變時(shí)需獲得通知的對(duì)象定義更新的接口
具體觀(guān)察者(ConcreteObserver):具體觀(guān)察者實(shí)現(xiàn)了觀(guān)察者Observer接口,并注冊(cè)具體主題,以便接收更新。
觀(guān)察者模式提供了一種對(duì)象設(shè)計(jì),讓主題和觀(guān)察者之間松耦合,當(dāng)兩個(gè)對(duì)象之間松耦合,它們依然可以交互,但是不太清楚彼此的細(xì)節(jié),主題只知道觀(guān)察者實(shí)現(xiàn)了Observer接口,不需要知道觀(guān)察者的具體類(lèi)是誰(shuí),做了些什么其他的細(xì)節(jié)。
觀(guān)察者實(shí)例:
通過(guò)ConcreteObserver注冊(cè)兩個(gè)觀(guān)察者ConcreteObserverA和ConcreteObserverB,一旦被觀(guān)察者有更新,兩個(gè)觀(guān)察者會(huì)立刻收到更新通知。具體代碼如下:
聲明Subject主題接口,Subject.java:
publicinterfaceSubject { voidregisterObserver(Observer observer);voidremoveObserver(Observer observer); voidnotifyObservers(); }
聲明ConcreteObserver具體主題,NetConcreteSubject.java:
publicclassNetConcreteSubjectimplementsSubject{privateList《Observer》 observers;privateObserverBean bean; publicNetConcreteSubject() { observers = newArrayList《》(); }@OverridepublicvoidregisterObserver(Observer observer) { observers.add(observer); }@OverridepublicvoidremoveObserver(Observer observer) { intpos = observers.indexOf(observer); if(pos 》 0) { observers.remove(pos); } }@OverridepublicvoidnotifyObservers() { if(bean == null) return; for( inti = 0; i 《 observers.size(); i++) { Observer observer = observers.get(i); observer.update(bean); } }publicvoidsetStatusChanged(ObserverBean bean) { this.bean = bean; notifyObservers(); } }
聲明觀(guān)察者接口, Observer.java:
publicinterfaceObserver { voidupdate(Object obj); }
聲明具體觀(guān)察者類(lèi),ConcreteObserverA.java:
publicclassConcreteObserverAimplementsObserver{@Overridepublicvoidupdate(Object obj) { if(obj instanceofObserverBean) { ObserverBean bean = (ObserverBean) obj; System.out.print( “ConcreteObserverA 網(wǎng)絡(luò)類(lèi)型:”+ bean.netType + “,網(wǎng)絡(luò)狀態(tài):”+ bean.netStatus + “\n”); } } }
ConcreteObserverB.java:
publicclassConcreteObserverBimplementsObserver{@Overridepublicvoidupdate(Object obj) { if(obj instanceofObserverBean) { ObserverBean bean = (ObserverBean) obj; System.out.print( “ConcreteObserverB 網(wǎng)絡(luò)類(lèi)型:”+ bean.netType + “,網(wǎng)絡(luò)狀態(tài):”+ bean.netStatus + “\n”); } } }
調(diào)用過(guò)程:
publicstaticvoidmain(String[] args) { //初始化主題(被觀(guān)察者)NetConcreteSubject subject =newNetConcreteSubject(); //初始化觀(guān)察者AConcreteObserverA observerA =newConcreteObserverA(); //初始化觀(guān)察者BConcreteObserverB observerB =newConcreteObserverB(); //注冊(cè)觀(guān)察者Asubject.registerObserver(observerA); //注冊(cè)觀(guān)察者Bsubject.registerObserver(observerB); //通知所有觀(guān)察者數(shù)據(jù)有更新ObserverBean bean = newObserverBean( “wifi”, “有網(wǎng)”); subject.setStatusChanged(bean); }
運(yùn)行結(jié)果:
ConcreteObserverA 網(wǎng)絡(luò)類(lèi)型:wifi,網(wǎng)絡(luò)狀態(tài):有網(wǎng) ConcreteObserverB 網(wǎng)絡(luò)類(lèi)型:wifi,網(wǎng)絡(luò)狀態(tài):有網(wǎng)Java內(nèi)置觀(guān)察者:
Observable.java:
/** * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java! */publicclassObservable{privatebooleanchanged = false; privateVector《Observer》 obs =newVector(); publicObservable() { } publicsynchronizedvoidaddObserver(Observer var1) {if(var1 == null) { thrownewNullPointerException(); } else{ if(! this.obs.contains(var1)) {this.obs.addElement(var1); } } } publicsynchronizedvoiddeleteObserver(Observer var1) {this.obs.removeElement(var1); } publicvoidnotifyObservers() {this.notifyObservers((Object) null); } publicvoidnotifyObservers(Object var1) { Object[] var2; synchronized( this) { if(! this.changed) { return; } var2 = this.obs.toArray();this.clearChanged(); } for( intvar3 = var2.length - 1; var3 》= 0; --var3) { ((Observer)var2[var3]).update( this, var1); } } publicsynchronizedvoiddeleteObservers() {this.obs.removeAllElements(); } protectedsynchronizedvoidsetChanged() { this.changed =true; } protectedsynchronizedvoidclearChanged() { this.changed = false; }publicsynchronizedbooleanhasChanged() { returnthis.changed; }publicsynchronizedintcountObservers() { returnthis.obs.size(); } }
Observer.java:
publicinterfaceObserver { voidupdate(Observable var1, Object var2); }
上面的Observer和Observable類(lèi)都位于java.util目錄中,是JDK中已經(jīng)寫(xiě)好的,那么我們可以直接拿來(lái)用了:
主題類(lèi)NetSubject.java:
publicclassNetSubjectextendsObservable{publicvoidsetNetChanged(ObserverBean bean){ setChanged(); notifyObservers(bean); } }
觀(guān)察者SystemObserverA.java:
publicclassSystemObserverAimplementsObserver{@Overridepublicvoidupdate(Observable observable, Object o) { if(o instanceofObserverBean && observable instanceofNetSubject) { ObserverBean bean = (ObserverBean) o; System.out.print( “ConcreteObserverA 網(wǎng)絡(luò)類(lèi)型:”+ bean.netType + “,網(wǎng)絡(luò)狀態(tài):”+ bean.netStatus + “\n”); } } }
觀(guān)察者SystemObserverB.java:
/** * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java! */publicclassSystemObserverBimplementsObserver{@Overridepublicvoidupdate(Observable observable, Object o) { if(o instanceofObserverBean && observable instanceofNetSubject) { ObserverBean bean = (ObserverBean) o; System.out.print( “ConcreteObserverB 網(wǎng)絡(luò)類(lèi)型:”+ bean.netType + “,網(wǎng)絡(luò)狀態(tài):”+ bean.netStatus + “\n”); } } }
執(zhí)行程序:
//初始化主題(被觀(guān)察者)NetSubject subject = newNetSubject(); //初始化觀(guān)察者ASystemObserverA observerA = newSystemObserverA(); //初始化觀(guān)察者BSystemObserverB observerB = newSystemObserverB(); //注冊(cè)觀(guān)察者Asubject.addObserver(observerA); //注冊(cè)觀(guān)察者Bsubject.addObserver(observerB); //通知觀(guān)察者有更新ObserverBean bean = newObserverBean( “4G流量”, “有網(wǎng)”); subject.setNetChanged(bean);
運(yùn)行結(jié)果:
ConcreteObserverB 網(wǎng)絡(luò)類(lèi)型:4G流量,網(wǎng)絡(luò)狀態(tài):有網(wǎng) ConcreteObserverA 網(wǎng)絡(luò)類(lèi)型:4G流量,網(wǎng)絡(luò)狀態(tài):有網(wǎng)
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%