每天一個設計模式-觀察者模式 定義: 觀察者模式定義了對象之間的一對多依賴,當一個對象狀態改變時,他的所有依賴者都會收到通知並自動更新。比如報紙訂閱服務: 客戶訂閱某種報紙,該類報紙更新時,報社將最新的報紙發送給客戶。 實現: 報社要想把最新的報紙發送給客戶,就需要知道訂閱的客戶,即報社需要維護一個 ...
每天一個設計模式-觀察者模式
定義:
觀察者模式定義了對象之間的一對多依賴,當一個對象狀態改變時,他的所有依賴者都會收到通知並自動更新。比如報紙訂閱服務:
客戶訂閱某種報紙,該類報紙更新時,報社將最新的報紙發送給客戶。
實現:
報社要想把最新的報紙發送給客戶,就需要知道訂閱的客戶,即報社需要維護一個訂閱客戶列表;為了實現自動將更新的報紙發送給感興趣的客戶方,就得在這個列表上做文章,而java中的介面可以很好的完成這個任務,顯然,這個介面需要定義一個方法來告訴所有的訂閱者“有報紙更新了”。比如:定義一個介面,所有的客戶都要實現這個介面,介面有一個update方法,這個方法用來告訴訂閱方有新報紙出版了。報社維護著訂閱客戶列表,報社統一通知所有的訂閱方就變得很容易實現。在這個例子中提到了報社,客戶。同樣在觀察者模式中我們叫做目標(主題),觀察者。多個觀察者觀察著目標,當目標狀態改變時會自動通知所有的觀察者,觀察者做出相應的反應。
狀態改變即對象產生了變化,比如:報社出版了新報紙,按鈕從未點擊到點擊狀態等。
模式講解:
觀察者模式提供了一種對象設計,讓主題和觀察者之間松耦合(主題不知道觀察者的具體類型,也不需要知道,只知道他們都實現了一個共同的介面就可以了,主題只需對這個抽象的介面進行操作,在運行時動態的調用具體的觀察者方法)。
拓展:
- 觀察者模式有兩種類型,即“推,拉”,區別主要就是主動性問題,推:主動權在目標上,目標推給觀察者什麼內容,觀察者就處理什麼內容;拉:主動權在觀察者上,當目標狀態改變時,目標會把自身發送給觀察者,由觀察者自己選擇需要什麼數據。
- java中已經內置了觀察者模式,使用類似,但沒有自己定義觀察者模式使用靈活,並且自定義的觀察者模式實現起來也不複雜。
轉載註明出處:http://www.cnblogs.com/xiemubg/p/6740811.html