設(shè)計模式之——觀察者模式

前言:
本文僅作為第一次學(xué)習(xí)設(shè)計模式的參考和筆記时迫。
初探觀察者模式:

觀察者模式:Observer Pattern


又名:發(fā)布訂閱模式捣辆。

原話:Define a one-to-many dependency between objects so that when one object changes state ,all its dependents are notified and updated automatically.
直譯:定義對象間一種一對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。(因為你變了而线,所以我們也變了)

1. 定義:被觀察者(一個對象)改變某種狀態(tài),所有觀察者(多個對象)會做出相應(yīng)的反應(yīng)恋日。
2. 示例類圖:
觀察者模式通用類圖
  • Subject:被觀察者
  • Observer觀察者
  • ConcreteSubject具體的被觀察者
  • ConcreteObserver具體的觀察者
3. 示例代碼:
//被觀察者:Subject
abstract class Subject{
    //定義一個觀察者數(shù)組
    private Vector<Observer> ObsVector =  new Vector<Observer>();
    //增加一個觀察者
    public void addObserver(Observer o){
        this.ObsVector.add(o);
    }
    //刪除一個觀察者
    public void delObserver(Observer o){
        this.ObsVector.remove(o);
    }
    //通知所有觀察者
    public void notifyObservers(){
        for(Observer o:this.ObsVector){
            o.update();
        }
    }
}

//具體的被觀察者:ConcreteSubject
class ConcreteSubject extends Subject{
    //具體的業(yè)務(wù)
    public void doSomeThing(){
        
        /*
         *   do something here!
         */
        
        //最后 通知所有觀察者
        super.notifyObservers();
    }
}

//觀察者接口:Observer
instance Observer{
    //更新方法
    public void update();
}

//具體的觀察者:ConcreteObserver
class ConcreteObserver implements Observer{
    //實現(xiàn)更新方法
    public void update(){
        
        //becasuse of Subject ,ConcreteObserver do something here, and response膀篮!
        
    }
}

public class Client{
    public static void main(String[] args){
        //1.創(chuàng)建一個被觀察者
        ConcreteSubject subject = new ConcreteSubject();
        //2.定義一個觀察者
        Observer obs = new ConcreteSubject();
        //3.觀察者觀察被觀察者
        subject.addObserver(obs);
        //4.被觀察者行動,所有觀察者連鎖行動
        subject.doSomeThing();
    }
}
4. 優(yōu)點:
  • 觀察者和被觀察者之間 低耦合
  • 可建立一套完美的連續(xù)觸發(fā)機(jī)制
5. 缺點:
  • 復(fù)雜的調(diào)用岂膳,降低開發(fā)效率誓竿,以及運(yùn)行效率
  • 一個觀察者卡住,整體會卡滋附亍(多采用多線程異步處理)
6. 使用場景:
  • 關(guān)聯(lián)行為場景
  • 事件多級觸發(fā)場景
  • 跨系統(tǒng)的消息交換場景
7. 注意事項:
  • 廣播鏈問題:
    一個對象可以有雙重身份筷屡,既是觀察者,又是被觀察者簸喂。邏輯復(fù)雜毙死,可維護(hù)性降低。一個項目最好最多只出現(xiàn)一個對象既是觀察者又是被觀察者喻鳄,這比較好控制扼倘。
  • 異步處理問題:
    如果觀察者比較多,處理時間較長除呵,使用多線程異步處理唉锌,多線程異步就要考慮到 “線程的安全” 和 “隊列”的問題。
8. 擴(kuò)展:JAVA的JDK中竿奏,提供了java.util.Observable實現(xiàn)類和java.util.Observer接口⌒确牛可以直接繼承使用泛啸,更加簡單方便。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秃症,一起剝皮案震驚了整個濱河市候址,隨后出現(xiàn)的幾起案子吕粹,更是在濱河造成了極大的恐慌,老刑警劉巖岗仑,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匹耕,死亡現(xiàn)場離奇詭異,居然都是意外死亡荠雕,警方通過查閱死者的電腦和手機(jī)稳其,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炸卑,“玉大人既鞠,你說我怎么就攤上這事「俏模” “怎么了嘱蛋?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長五续。 經(jīng)常有香客問我洒敏,道長,這世上最難降的妖魔是什么疙驾? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任凶伙,我火速辦了婚禮,結(jié)果婚禮上荆萤,老公的妹妹穿的比我還像新娘镊靴。我一直安慰自己,他們只是感情好链韭,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布偏竟。 她就那樣靜靜地躺著,像睡著了一般敞峭。 火紅的嫁衣襯著肌膚如雪踊谋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天旋讹,我揣著相機(jī)與錄音殖蚕,去河邊找鬼。 笑死沉迹,一個胖子當(dāng)著我的面吹牛睦疫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞭呕,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛤育,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓦糕,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤底洗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咕娄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亥揖,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年圣勒,在試婚紗的時候發(fā)現(xiàn)自己被綠了费变。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡灾而,死狀恐怖胡控,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旁趟,我是刑警寧澤昼激,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站锡搜,受9級特大地震影響橙困,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耕餐,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一凡傅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肠缔,春花似錦夏跷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趟妥,卻和暖如春猫态,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背披摄。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工亲雪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疚膊。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓义辕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寓盗。 傳聞我的和親對象是個殘疾皇子终息,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 前言定義:觀察者設(shè)計模式定義了對象間的一種一對多的依賴關(guān)系夺巩,以便一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到...
    xsp單細(xì)胞閱讀 453評論 0 1
  • 前言: 之前項目有個模塊需要實現(xiàn)被通知的作用周崭,那是第一時間就想到了觀察者,那個模塊是對象間一對一的依賴關(guān)系喳张,...
    felicia_coder閱讀 399評論 0 2
  • 觀察者模式 Rxjava中運(yùn)用到了觀察者模式续镇,那什么是觀察者模式呢,現(xiàn)在來學(xué)習(xí)一下销部。正所謂觀察摸航,就是看,細(xì)察事物的...
    cgzysan閱讀 553評論 0 4
  • 當(dāng)年醉花蔭下 紅顏剎那 菱花淚朱砂 猶記歌里繁華 夢里煙花 憑誰錯牽掛 黃鶴樓空蕭條 羈旅天涯 青絲成白發(fā) 流年偷...
  • 半夜舅桩,被震天的鑼鼓嚇醒 門縫塞進(jìn)一份報紙來 上說 無量大道前幾日吊死了個人的那棵杉樹上夾著半只狗 附有一張照片 狗...
    scumalapert閱讀 726評論 4 2