設計模式解析和實現(C++)之十五-Observer模式

一、 觀察者(Observer)模式

觀察者模式又叫做發佈-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

一 個軟件系統常常要求在某一個對象的狀態發生變化的時候,某些其它的對象做出相應的改變。做到這一點的設計方案有很多,但是爲了使系統能夠易於複用,應該選 擇低耦合度的設計方案。減少對象之間的耦合有利於系統的複用,但是同時設計師需要使這些低耦合度的對象之間能夠維持行動的協調一致,保證高度的協作 (Collaboration)。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

 

作用:

    定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。

    UML結構圖:

    解析:

    Observer模式定義的是一種一對多的關係,這裏的一就是圖中的Subject類,而多則是Obesrver類,當Subject類的狀態發生變化的 時候通知與之對應的Obesrver類們也去相應的更新狀態,同時支持動態的添加和刪除Observer對象的功能。Obesrver模式的實現要點是, 第一一般subject類都是採用鏈表等容器來存放Observer對象,第二抽取出Observer對象的一些公共的屬性形成Observer基類,而 Subject中保存的則是Observer類對象的指針,這樣就使Subject和具體的Observer實現瞭解耦,也就是Subject不需要去關 心到底是哪個Observer對放進了自己的容器中。生活中有很多例子可以看做是Observer模式的運用,比方說,一個班有一個班主任 (Subject),他管理手下的一幫學生(Observer),當班裏有一些事情發生需要通知學生的時候,班主任要做的不是逐個學生挨個的通知而是把學 生召集起來一起通知,實現了班主任和具體學生的關係解耦。

 

可以看出,在這個觀察者模式的實現裏有下面這些角色:

  • 抽象主題(Subject)角色 :主題角色把所有對觀察考對象的引用保存在一個聚集裏,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,主題角色又叫做抽象被觀察者(Observable)角色,一般用一個抽象類或者一個接口實現。
  • 抽象觀察者(Observer)角色 :爲所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。這個接口叫做更新接口。抽象觀察者角色一般用一個抽象類或者一個接口實現。在這個示意性的實現中,更新接口只包含一個方法(即Update()方法),這個方法叫做更新方法。
  • 具體主題(ConcreteSubject)角色 :將有關狀態存入具體現察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者角色(Concrete Observable)。具體主題角色通常用一個具體子類實現。
  • 具體觀察者(ConcreteObserver)角色 :存儲與主題的狀態自恰的狀態。具體現察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。如果需要,具體現察者角色可以保存一個指向具體主題對象的引用。具體觀察者角色通常用一個具體子類實現。

從 具體主題角色指向抽象觀察者角色的合成關係,代表具體主題對象可以有任意多個對抽象觀察者對象的引用。之所以使用抽象觀察者而不是具體觀察者,意味着主題 對象不需要知道引用了哪些ConcreteObserver類型,而只知道抽象Observer類型。這就使得具體主題對象可以動態地維護一系列的對觀察 者對象的引用,並在需要的時候調用每一個觀察者共有的Update()方法。這種做法叫做"針對抽象編程"。

 

you google the the source code from web site

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章