日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

设计模式学习笔记-观察者模式(转)

發(fā)布時間:2025/7/14 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式学习笔记-观察者模式(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

1. 概述

  有時被稱作發(fā)布/訂閱模式,觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

2. 解決的問題

  將一個系統(tǒng)分割成一個一些類相互協(xié)作的類有一個不好的副作用,那就是需要維護相關對象間的一致性。我們不希望為了維持一致性而使各類緊密耦合,這樣會給維護、擴展和重用都帶來不便。觀察者就是解決這類的耦合關系的。

3. 模式中的角色

  3.1 抽象主題(Subject):它把所有觀察者對象的引用保存到一個聚集里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。

  3.2 具體主題(ConcreteSubject):將有關狀態(tài)存入具體觀察者對象;在具體主題內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。

  3.3 抽象觀察者(Observer):為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。

  3.4 具體觀察者(ConcreteObserver):實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題狀態(tài)協(xié)調(diào)。

4. 模式解讀

  4.1?觀察者模式的類圖  

  

  4.2?觀察者模式的代碼

/// <summary>/// 抽象主題類/// </summary>public abstract class Subject{private IList<Observer> observers = new List<Observer>();/// <summary>/// 增加觀察者/// </summary>/// <param name="observer"></param>public void Attach(Observer observer){observers.Add(observer);}/// <summary>/// 移除觀察者/// </summary>/// <param name="observer"></param>public void Detach(Observer observer){observers.Remove(observer);}/// <summary>/// 向觀察者(們)發(fā)出通知/// </summary>public void Notify(){foreach (Observer o in observers){o.Update();}}}/// <summary>/// 抽象觀察者類,為所有具體觀察者定義一個接口,在得到通知時更新自己/// </summary>public abstract class Observer{public abstract void Update();}/// <summary>/// 具體觀察者或具體通知者,將有關狀態(tài)存入具體觀察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色通常用一個具體子類實現(xiàn)。/// </summary>public class ConcreteSubject : Subject{private string subjectState;/// <summary>/// 具體觀察者的狀態(tài)/// </summary>public string SubjectState{get { return subjectState; }set { subjectState = value; }}}/// <summary>/// 具體觀察者,實現(xiàn)抽象觀察者角色所要求的更新接口,已是本身狀態(tài)與主題狀態(tài)相協(xié)調(diào)/// </summary>public class ConcreteObserver : Observer{private string observerState;private string name;private ConcreteSubject subject;/// <summary>/// 具體觀察者用一個具體主題來實現(xiàn)/// </summary>public ConcreteSubject Subject{get { return subject; }set { subject = value; }}public ConcreteObserver(ConcreteSubject subject, string name){this.subject = subject;this.name = name;}/// <summary>/// 實現(xiàn)抽象觀察者中的更新操作/// </summary>public override void Update(){observerState = subject.SubjectState;Console.WriteLine("The observer's state of {0} is {1}", name, observerState);}}

  4.3?客戶端代碼

class Program{static void Main(string[] args){// 具體主題角色通常用具體自來來實現(xiàn)ConcreteSubject subject = new ConcreteSubject();subject.Attach(new ConcreteObserver(subject, "Observer A"));subject.Attach(new ConcreteObserver(subject, "Observer B"));subject.Attach(new ConcreteObserver(subject, "Observer C"));subject.SubjectState = "Ready";subject.Notify();Console.Read();}}

  運行結(jié)果

  

5. 模式總結(jié)

  5.1 優(yōu)點

    5.1.1 觀察者模式解除了主題和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不是依賴具體。從而使得各自的變化都不會影響另一邊的變化。

  5.2 缺點

    5.2.1 依賴關系并未完全解除,抽象通知者依舊依賴抽象的觀察者。

  5.3 適用場景

    5.3.1 當一個對象的改變需要給變其它對象時,而且它不知道具體有多少個對象有待改變時。

    5.3.2 一個抽象某型有兩個方面,當其中一個方面依賴于另一個方面,這時用觀察者模式可以將這兩者封裝在獨立的對象中使它們各自獨立地改變和復用。

?

轉(zhuǎn)載于:https://www.cnblogs.com/mumuli/p/4375167.html

總結(jié)

以上是生活随笔為你收集整理的设计模式学习笔记-观察者模式(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。