觀察者模式

定義

觀察者模式定義了對(duì)象之間的一對(duì)多依賴先舷,這樣當(dāng)一個(gè)對(duì)象(稱為主題)改變狀態(tài)時(shí)坡疼,它的所有依賴者(稱為觀察者)都會(huì)收到通知并自動(dòng)更新镀钓。

類圖

觀察者模式類圖

其中所涉及到的對(duì)象有:

  • 抽象主題(Subject)接口:將觀察者對(duì)象引用存放在一個(gè)集合里(例如ArrayList)进栽,封裝了對(duì)觀察者的一些行為方法雷滋,可以進(jìn)行觀察者的注冊(cè)(添加對(duì)象)、刪除以及喚醒(向觀察者送出通知)臼勉。
  • 具體主題(ConcreteSubject):掌握一些數(shù)據(jù)邻吭,實(shí)現(xiàn)了主題接口中對(duì)觀察者的操作方法。
  • 抽象觀察者(Observer)接口:為所有具體的觀察者定義了一個(gè)接口宴霸,在接到主題通知時(shí)囱晴,更新自己。
  • 具體觀察者(ConcreteObserver):包含了主題對(duì)象的引用瓢谢,當(dāng)主題對(duì)象改變時(shí)畸写,利用update()方法更新自己。

實(shí)例

建設(shè)一個(gè)氣象站氓扛,其中包括氣象觀測站以及天氣布告板枯芬。氣象觀測站有天氣的各項(xiàng)參數(shù),它將參數(shù)推送給布告板讓其顯示天氣參數(shù)采郎。
代碼:

public interface Subject{//抽象主題類
      public abstract void registerObserver(Observer observer);
      public abstract void removeObserver(Observer observer);
      public abstract void notifyObservers();
}
public class WeatherData implements Subject{//具體主題類
    ArrayList<Observer> observers;
    private float temerature;
    private float humidity;
    private float pressure;
    public WeatherData(){
          observers=new ArrayList<Observer>();
    }
    public void registerObserver(Observer observer){//添加觀察者
          observers.add(observer);
    }
    public void removeObserver(Observer observer){//刪除觀察者
          observers.remove(observer);
    }  
    public void notifyObservers(){//向觀察者推送更新
          for(int i=0;i<observers.size();i++){
                Observer o=observers.get(i);
                o.update(temperature,humidity,pressure);
          }
    }
    public void measurementsChanged(){//客戶端調(diào)用該方法觀測更新
          notifyObservers();
    }
    public void setMeasurements(float temperature,float humidity,float pressure){
         this.temperature=temperature;
         this.humidity=humidity;
         this.pressure=pressure;
         measurementsChanged()
    }
    
public interface Observer{//觀察者接口
    abstract  void update(float temperature,float humidity,float pressure);
}
public class Display implements Observer{//具體觀察者類
    private float temperature;
    private float humidity;
    private float pressure;
    Subject subject;
    public Display(Subject subject){
         this.subject=subject;
    }
    public void update(float temp,float humidity,float pressure){
         this.temperature=temp;
         this.humidity=humidity;
         this.pressure=pressure;
         display();
    }
    public void display(){
      //實(shí)現(xiàn)顯示
    }
}
public class Client{//客戶端
    public static void main(String[] args){
        WeatherData weatherData=new WeatherData();//創(chuàng)建主題對(duì)象
        Display display=new Display(weatherData);//創(chuàng)建觀察者對(duì)象千所,并與對(duì)應(yīng)主題關(guān)聯(lián)
        weatherData.setMeasurements(80,65,30f);//設(shè)置更新數(shù)據(jù),此時(shí)已經(jīng)向觀察者推送了更新同時(shí)觀察者收到了更新蒜埋。
   }
}

擴(kuò)展

  • 可以在主題中加入標(biāo)記主題狀態(tài)是否更改的變量淫痰,以便更好地給觀察者推送更新
  • 以上介紹的觀察者模式中只有主題將自己所有的數(shù)據(jù)都推送給觀察者,不管觀察者是否需要整份『诮纾可以加入觀察者自己“拉”數(shù)據(jù)的模式,只獲取其有用的數(shù)據(jù)皂林。即在主題中加入返回?cái)?shù)據(jù)的方法
  • java JDK中提供了觀察者模式的接口,其為java.util包中的Observable(主題)類和Observer接口蚯撩,該模式提供了“推”和“拉”數(shù)據(jù)兩種方法础倍。
  • 觀察者模式實(shí)現(xiàn)了主題和對(duì)象之間的松耦合,即它們彼此可以交互胎挎,但是不清楚彼此的細(xì)節(jié)沟启。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市犹菇,隨后出現(xiàn)的幾起案子德迹,更是在濱河造成了極大的恐慌,老刑警劉巖揭芍,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胳搞,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肌毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門筷转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬而,你說我怎么就攤上這事呜舒。” “怎么了笨奠?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵袭蝗,是天一觀的道長。 經(jīng)常有香客問我般婆,道長到腥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任腺兴,我火速辦了婚禮左电,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘页响。我一直安慰自己篓足,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布闰蚕。 她就那樣靜靜地躺著栈拖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪没陡。 梳的紋絲不亂的頭發(fā)上涩哟,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音盼玄,去河邊找鬼贴彼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埃儿,可吹牛的內(nèi)容都是我干的器仗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼童番,長吁一口氣:“原來是場噩夢啊……” “哼精钮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剃斧,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤轨香,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幼东,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臂容,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡科雳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了策橘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炸渡。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丽已,靈堂內(nèi)的尸體忽然破棺而出蚌堵,到底是詐尸還是另有隱情,我是刑警寧澤沛婴,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布吼畏,位于F島的核電站,受9級(jí)特大地震影響嘁灯,放射性物質(zhì)發(fā)生泄漏泻蚊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一丑婿、第九天 我趴在偏房一處隱蔽的房頂上張望性雄。 院中可真熱鬧,春花似錦羹奉、人聲如沸秒旋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迁筛。三九已至,卻和暖如春耕挨,著一層夾襖步出監(jiān)牢的瞬間细卧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工筒占, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贪庙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓翰苫,卻偏偏與公主長得像插勤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子革骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容