觀察者設(shè)計模式

定義:

定義對象間一種一對多的依賴關(guān)系滥壕,使得當每一個對象改變狀態(tài)陵且,則所有依賴于它的對象都會得到通知并自動更新。

類型:

行為類模式

類圖:
observer-pattern
使用場景 :

在軟件系統(tǒng)中經(jīng)常會有這樣的需求:如果一個對象的狀態(tài)發(fā)生改變,某些與它相關(guān)的對象也要隨之做出相應(yīng)的變化。比如璃氢,我們要設(shè)計一個右鍵菜單的功能,只要在軟件的有效區(qū)域內(nèi)點擊鼠標右鍵录择,就會彈出一個菜單拔莱;再比如,我們要設(shè)計一個自動部署的功能隘竭,就像eclipse開發(fā)時,只要修改了文件讼渊,eclipse就會自動將修改的文件部署到服務(wù)器中动看。這兩個功能有一個相似的地方,那就是一個對象要時刻監(jiān)聽著另一個對象爪幻,只要它的狀態(tài)一發(fā)生改變菱皆,自己隨之要做出相應(yīng)的行動。其實挨稿,能夠?qū)崿F(xiàn)這一點的方案很多仇轻,但是,無疑使用觀察者模式是一個主流的選擇奶甘。
觀察者模式的結(jié)構(gòu)
在最基礎(chǔ)的觀察者模式中篷店,包括以下四個角色:
被觀察者:從類圖中可以看到,類中有一個用來存放觀察者對象的Vector容器(之所以使用Vector而不使用List,是因為多線程操作時疲陕,Vector在是安全的方淤,而List則是不安全的),這個Vector容器是被觀察者類的核心蹄殃,另外還有三個方法:attach方法是向這個容器中添加觀察者對象携茂;detach方法是從容器中移除觀察者對象;notify方法是依次調(diào)用觀察者對象的對應(yīng)方法诅岩。這個角色可以是接口讳苦,也可以是抽象類或者具體的類,因為很多情況下會與其他的模式混用吩谦,所以使用抽象類的情況比較多鸳谜。
觀察者:觀察者角色一般是一個接口,它只有一個update方法逮京,在被觀察者狀態(tài)發(fā)生變化時卿堂,這個方法就會被觸發(fā)調(diào)用。
具體的被觀察者:使用這個角色是為了便于擴展懒棉,可以在此角色中定義具體的業(yè)務(wù)邏輯草描。
具體的觀察者:觀察者接口的具體實現(xiàn),在這個角色中策严,將定義被觀察者對象狀態(tài)發(fā)生變化時所要處理的邏輯穗慕。

代碼實現(xiàn) :

被觀察者 :

public class Teacher {
/**
 * 模擬發(fā)布消息
 */
public void publishMessage(String message) {
    //通知所有的觀察者
    notifyObservers(message);
}

//1.定義接口和接口方法
public interface MessageObserver {
    void onMessageChanged(String message);
}

//2.定義接口對象的集合
private List<MessageObserver>   observers   = new ArrayList<>();

//3.添加觀察者
public synchronized void addObserver(MessageObserver o) {
    if (o == null)
        throw new NullPointerException();
    if (!observers.contains(o)) {
        observers.add(o);
    }
}

//4.移除觀察者
public synchronized void deleteObserver(MessageObserver o) {
    observers.remove(o);
}

//5.通知所有的觀察者
public void notifyObservers(String message) {
    for (MessageObserver o : observers) {
        o.onMessageChanged(message);
    }
  }
}

觀察者 :

public class Student1 implements MessageObserver {
@Override
    public void onMessageChanged(String message) {
        System.out.println(this.getClass().getSimpleName() + " 接收到消息 :  " + message);
  }
}

測試類 :

public class Test {
public static void main(String[] args) {
    //1.創(chuàng)建發(fā)布消息的人
    Teacher t = new Teacher();

    //2.創(chuàng)建接收消息的人
    Student1 student1 = new Student1();
    Student2 student2 = new Student2();
    Student3 student3 = new Student3();
    Student4 student4 = new Student4();

    //訂閱消息
    t.addObserver(student1);
    t.addObserver(student2);
    t.addObserver(student3);
    t.addObserver(student4);

    //模擬發(fā)布消息
    t.publishMessage("考試成績不合格的中秋節(jié)不能放假");
    }
 }

參考資料:
http://wiki.jikexueyuan.com/project/java-design-pattern/observer-pattern.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妻导,隨后出現(xiàn)的幾起案子逛绵,更是在濱河造成了極大的恐慌,老刑警劉巖倔韭,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术浪,死亡現(xiàn)場離奇詭異,居然都是意外死亡寿酌,警方通過查閱死者的電腦和手機胰苏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醇疼,“玉大人硕并,你說我怎么就攤上這事⊙砭#” “怎么了倔毙?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乙濒。 經(jīng)常有香客問我陕赃,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任凯正,我火速辦了婚禮毙玻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廊散。我一直安慰自己桑滩,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布允睹。 她就那樣靜靜地躺著运准,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缭受。 梳的紋絲不亂的頭發(fā)上胁澳,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音米者,去河邊找鬼韭畸。 笑死,一個胖子當著我的面吹牛蔓搞,可吹牛的內(nèi)容都是我干的胰丁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喂分,長吁一口氣:“原來是場噩夢啊……” “哼锦庸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒲祈,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤甘萧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梆掸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扬卷,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年酸钦,在試婚紗的時候發(fā)現(xiàn)自己被綠了邀泉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钝鸽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庞钢,到底是詐尸還是另有隱情拔恰,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布基括,位于F島的核電站颜懊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜河爹,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一匠璧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咸这,春花似錦夷恍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侄刽,卻和暖如春指黎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背州丹。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工醋安, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墓毒。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓吓揪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚁鳖。 傳聞我的和親對象是個殘疾皇子磺芭,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 主目錄見:Android高級進階知識(這是總目錄索引)這篇文章我們會來討論另外一個設(shè)計模式觀察者設(shè)計模式,這個設(shè)計...
    ZJ_Rocky閱讀 1,075評論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法醉箕,類相關(guān)的語法钾腺,內(nèi)部類的語法,繼承相關(guān)的語法讥裤,異常的語法放棒,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用己英、多...
    MinoyJet閱讀 3,939評論 1 15
  • 需求:當在一個類中需要調(diào)用另一個類中的方法间螟,使其具備通用性,使用步驟總結(jié)如下: 1损肛、找出被觀察者objectB(被...
    Goorwl閱讀 348評論 0 1
  • 都說從古到今厢破,婆婆與媳婦是就是誓不兩立的天敵,事實上治拿,在大多數(shù)家庭的確如此摩泪。 三兩知己聊天,女人之間的話題除了老公...
    冷珩湄閱讀 897評論 0 0