日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

设计模式系列之----观察者模式

發(fā)布時(shí)間:2025/7/14 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式系列之----观察者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

觀察者模式是一個(gè)廣播機(jī)制的基礎(chǔ),實(shí)現(xiàn)1對(duì)N的聯(lián)動(dòng),當(dāng)1發(fā)生變化,N跟著相應(yīng)變化,由此衍生了發(fā)布訂閱模式,其方式分兩種,①?gòu)?qiáng)制推送:當(dāng)1發(fā)生變化,強(qiáng)制N也跟著發(fā)生變化,②拉的方式,即N方可以自己決定是否接收,只有當(dāng)N這方有需要時(shí)才去獲取最新的,不然就算1方變化,N這方也不更新。

?觀察者接口和具體實(shí)現(xiàn)類:

/***觀察者接口*/ public interface Observer {void update(Subject subject);//觀察者接收一個(gè)推送過(guò)來(lái)的主題}//============================/***觀察者具體實(shí)現(xiàn)類*/ public class ObserverImpl implements Observer {private int state; //擁有與主體一致的狀態(tài),用于接收訂閱的主題內(nèi)容 public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Subject subject) {this.state=((ConcreteSubject)subject).getState();//在具體觀察者中進(jìn)行同步狀態(tài)更新}}

主題基類和主題具體類

/*** 主體的基類,定義了一些公用方法,沒(méi)有具體主題,也可以定義成抽象類*/ public class Subject {public List<Observer> list=new ArrayList<Observer>();//在主體方定義一個(gè)容器存放注冊(cè)的觀察者public void registerObserver(Observer obs){list.add(obs);//注冊(cè)觀察者,即把需要訂閱的觀察者加進(jìn)容器中}public void removeObserver(Observer obs){list.remove(obs);//移除觀察者}//主題發(fā)生變化時(shí),通知所有觀察者進(jìn)行更新public void notifyAllObservers(List<Observer> list){for (Observer observer : list) {observer.update(this);}}}//=================================================/***有具體主題的子類*/ public class ConcreteSubject extends Subject {private int state;//模擬一個(gè)具體主題public int getState() {return state;}public void setState(int state) {this.state = state;this.notifyAllObservers(list);//此步為關(guān)鍵,當(dāng)主題發(fā)生變化時(shí),主題中注冊(cè)的觀察者的狀態(tài)也跟著進(jìn)行更新} }

客戶端調(diào)用:

public static void main(String[] args) {ConcreteSubject concreteSubject = new ConcreteSubject();//目標(biāo)主題,發(fā)布者ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();concreteSubject.registerObserver(observer1);//注冊(cè)觀察者concreteSubject.registerObserver(observer2);concreteSubject.registerObserver(observer3); concreteSubject.setState(1000);//目標(biāo)主題狀態(tài)為1000System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也都為1000concreteSubject.setState(2000);//目標(biāo)主題狀態(tài)值發(fā)生改變System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也改為2000}

以上代碼是自己實(shí)現(xiàn)的觀察者模式,實(shí)際上JavaSE中已經(jīng)為我們提供了實(shí)現(xiàn)觀察者模式的基礎(chǔ),java.util.Observable類和java.util.Observer接口,通過(guò)這兩個(gè)對(duì)象可以方便的實(shí)現(xiàn)觀察者模式,java.util.Observable相當(dāng)于上面定義的Subject,Observable中定義好了一些常用的方法來(lái)添加觀察者,移除觀察者等,觀察者只要實(shí)現(xiàn)Observer接口就具有觀察者身份,可以被添加進(jìn)來(lái)。  

/*** 繼承JDK的Observable類實(shí)現(xiàn)主題*/ public class ConcreteSubject extends Observable{private int state;public int getState() {return state;}public void setState(int state) {this.state = state;super.setChanged();//當(dāng)次屬性發(fā)生改變時(shí),調(diào)用基類的setChanged()方法表示當(dāng)前觀察者有改變,//主要改變super.hasChanged()方法返回值,觀察者可以通過(guò)此值判斷目標(biāo)對(duì)象是否已改變super.notifyObservers(this.state);//把當(dāng)前發(fā)生改變的對(duì)象通知各個(gè)觀察者} }//===================================================/***實(shí)現(xiàn)JDK的觀察者接口,實(shí)現(xiàn)更新方法*/ public class ObserverImpl implements Observer {private int state; public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Observable o, Object obj) {setState(((ConcreteSubject)o).getState());//this.state =Integer.parseInt((String)obj);//也可以直接通過(guò)傳遞過(guò)來(lái)的參數(shù)賦值} }//==================================================public static void main(String[] args) {ConcreteSubject subject=new ConcreteSubject();ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();subject.addObserver(observer1);subject.addObserver(observer2);subject.addObserver(observer3);subject.setState(10);System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也都為1000subject.setState(2000);//目標(biāo)主題狀態(tài)值發(fā)生改變System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也改為2000}

JavaEE中監(jiān)聽(tīng)器就使用的是觀察者模式

  

轉(zhuǎn)載于:https://www.cnblogs.com/javabg/p/7443399.html

總結(jié)

以上是生活随笔為你收集整理的设计模式系列之----观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。