設計模式學習筆記一 觀察者模式

2021-08-28 07:04:36 字數 3818 閱讀 9414

觀察者模式定義了物件之間的一對多依賴,這樣一來,當乙個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。觀察者模式又叫做發布-訂閱(publish/subscribe)模式、模型-檢視(model/view)模式、源-***(source/listener)模式或從屬者(dependents)模式。

上面是比較官方的定義,可以用訂閱雜誌的模式來通俗理解觀察者模式。

如上圖,現有一本文學雜誌,一

一、二二、三三都喜歡文學,所以花錢訂閱了該雜誌,四四不喜歡文學,在其他三人訂閱雜誌的時候,他選擇躲在窩裡睡大覺。

新的一月到來,雜誌發布了最新的一期,這天一大早,雜誌社就把雜誌分別送到了一

一、二二、三三手中,三人坐著椅子上,一邊喝著熱牛奶,一邊翻看著絕世好文章,四四只能落寞躲在角落上,偷偷打起農藥。

這就是觀察者模式的通俗解釋,乙個「主題」,有乙個或多個「觀察者」,「觀察者」訂閱「主題」,「主題」更新,訂閱了該「主題」的「觀察者」都能收到通知,並進行相應的行為。

軟體系統常常要求建立一種物件與物件之間的依賴關係,乙個物件發生改變時將自動通知其他物件,其他物件將相應做出反應。做到這一點的設計方案有很多,但是為了使系統能夠易於復用,應該選擇低耦合度的設計方案。減少物件之間的耦合有利於系統的復用,但是同時需要使這些低耦合度的物件之間能夠維持行動的協調一致,保證高度的協作。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

這是摘自《headfirst 設計模式》一書中的類圖。從圖中應該能很清楚看出觀察者模式涉及的角色:

用**實現「訂閱報紙」,觀察者模式運用如下:

1.首先有抽象主題

/**

* 抽象主題

* * created by w1992wishes on 2017/10/17.

*/public inte***ce subject

2.有實現抽象主題的具體主題

/**

* 具體主題

* * created by w1992wishes on 2017/10/17.

*/public class maganize implements subject

public void registerobserver(observer observer)

public void removeobserver(observer observer)

}public void notifyobservers()

4.還有實現抽象觀察者的三個具體觀察者

/**

* 具體觀察者一一

* created by w1992wishes on 2017/10/17.

*/public class yiyi implements observer

}

/**

* 具體觀察者--二二

* * created by w1992wishes on 2017/10/17.

*/public class erer implements observer

}

/**

* 具體觀察者三三

* * created by w1992wishes on 2017/10/17.

*/public class sansan implements observer

}

5.最後有客戶端

/**

* 客戶端

* * created by w1992wishes on 2017/10/17.

*/public class client

}

顯示結果如下: 

publish new maganize: october new 

i am yiyi, now reading maganize: october new 

i am erer, now reading maganize: october new 

i am sansan, now reading maganize: october new

在執行時,這個客戶端首先建立了具體主題類的例項,以及三個觀察者物件。然後,它呼叫主題物件的registerobserver()方法,將觀察者物件向主題物件登記,也就是將它加入到主題物件的聚集中去。

這時,客戶端呼叫主題的publishnewmaganize()方法,改變了主題物件的內部狀態。主題物件在狀態發生變化時,呼叫超類的notifyobservers()方法,通知所有登記過的觀察者物件。

在觀察者模式中,又分為推模型和拉模型兩種方式。

主題物件向觀察者推送主題的詳細資訊,不管觀察者是否需要,推送的資訊通常是主題物件的全部或部分資料。

主題物件在通知觀察者的時候,只傳遞少量資訊。如果觀察者需要更具體的資訊,由觀察者主動到主題物件中獲取,相當於是觀察者從主題物件中拉資料。一般這種模型的實現中,會把主題物件自身通過update()方法傳遞給觀察者,這樣在觀察者需要獲取資料的時候,就可以通過這個引用來獲取了。

根據上面的描述,發現前面的例子就是典型的推模型,下面給出乙個拉模型的例項。

1.拉模型通常都是把主題物件當做引數傳遞。

/**

* 拉模型 抽象觀察者

* * created by w1992wishes on 2017/10/17.

*/public inte***ce observer

2.拉模型的具體觀察者類

/**

* 拉模型 具體觀察者一一

* created by w1992wishes on 2017/10/17.

*/public class yiyi implements observer

}

/**

* 拉模型 具體觀察者--二二

* * created by w1992wishes on 2017/10/17.

*/public class erer implements observer

}

/**

* 拉模型 具體觀察者三三

* * created by w1992wishes on 2017/10/17.

*/public class sansan implements observer

}

3.拉模型 拉模型的具體主題類

拉模型的主題類主要的改變是nodifyobservers()方法。在迴圈通知觀察者的時候,也就是迴圈呼叫觀察者的update()方法的時候,傳入的引數不同了。

/**

* 具體主題

* * created by w1992wishes on 2017/10/17.

*/public class maganize implements subject

public void registerobserver(observer observer)

public void removeobserver(observer observer)

}public void notifyobservers() {

for (int i=0; i在以下情況下可以使用觀察者模式:

觀察者模式在軟體開發中應用非常廣泛,如某電子商務**可以在執行傳送操作後給使用者多個傳送商品打折資訊,某團隊戰鬥遊戲中某隊友犧牲將給所有成員提示等等,凡是涉及到一對一或者一對多的物件互動場景都可以使用觀察者模式。

《設計模式》觀察者模式 學習筆記

元件協作 模式 現代軟體專業分工之後的第乙個結果是 框架與應用程式的劃分 元件協作 模式通過晚期繫結,來實現框架與應用程式之間的松耦合,是二者之間協作時常用的模式。典型模式 template method strategy observer event 定義物件間的一種一對多 變化 的依賴關係,以便...

設計模式學習筆記 觀察者模式

概述 觀察者模式 oberserver 定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動更新。實用性 1.當乙個物件有兩個方面,其中乙個方面依賴於另乙個方面。將二者封裝在獨立的物件中以使他們可以各自獨立的改變和復用。2.當乙個物件的改變需要同時改變其他...

學習設計模式 觀察者模式

說明 觀察者模式就是有兩個角色,乙個觀察者 乙個通知者,兩者的關係是多對一。當某個是事件觸發時,通知者通知觀察者去處理相應的事件。為了解耦合,需要將兩個角色都先抽象,然後再定義具體的實現類。缺點 需要所有觀察者處理相應事件名稱一致 需求 學生自習的時候開小差,需要代表時刻觀察老師是否來了,如果來了,...