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

來源:互聯網
上載者:User

概述:                                                                                                        

觀察者模式(Oberserver):定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動更新。

實用性:                                                                                                     

1.當一個對象有兩個方面,其中一個方面依賴於另一個方面。將二者封裝在獨立的對象中以使他們可以各自獨立的改變和複用。

2.當一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變。

3.當一個對象必須通知其他對象,而又不能假定其他對象是誰。

類圖:                                                                                                         

程式碼範例:                                                                                                   

1.定義抽象通知者

    /// <summary>
/// 抽象通知者,用抽象類別或者借口實現。把所有對觀察者對象的引用儲存在一個聚集裡
/// 每個通知者都可以有任何熟練的觀察者,抽象通知者提供一個介面,可以增加和刪除,通知觀察者對象,
/// </summary>
abstract class Subject
{
private IList<Observer> observers = new List<Observer>();

//增加觀察者
public void Attach(Observer observer)
{
observers.Add(observer);
}
//移除觀察者
public void Dettach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach(Observer o in observers)
{
o.Update();
}
}
}

2.定義抽象觀察者

    /// <summary>
/// 抽象觀察者,為所有的具體觀察者定義一個介面,
/// 得到通知者的通知時更新自己,這個介面叫做更新介面
/// 抽象觀察者一般用一個抽象類別或者一個介面實現,更新介面一般包含一個Update方法,
/// </summary>
abstract class Observer
{
public abstract void Update();
}

3.定義具體觀察者

    /// <summary>
/// 具體的通知者,將有關狀態存入具體觀察者對象,在具體通知者的
/// 內部狀態改變時,給所有登記過的觀察者發出通知
/// </summary>
class ConcreteSubject:Subject
{
/// <summary>
/// 具體觀察者狀態
/// </summary>
private string subjectState;

public string SubjectState
{
get { return subjectState; }
set { subjectState = value; }
}
}

4.定義具體通知者

    /// <summary>
/// 具體觀察者,實現抽象觀察者的更新介面,以便本身的狀態與通知者的狀態保持
/// </summary>
class ConcreteObserver:Observer
{
private string name;
private string observerState;
private ConcreteSubject subject;

public ConcreteObserver(ConcreteSubject subject,string name)
{
this.subject = subject;
this.name = name;
}
public override void Update()
{
observerState =subject.SubjectState;
Console.WriteLine("觀察者{0}的新狀態是{1}",name,observerState);
}
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
}

5.用戶端調用

        /// <summary>
/// 測試觀察者模式
/// </summary>
static void TestObserver()
{
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s,"X"));
s.Attach(new ConcreteObserver(s, "Y"));
s.Attach(new ConcreteObserver(s,"Z"));

s.SubjectState = "ABC";
s.Notify();
Console.Read();
}

小結:                                                                                                         

觀察者模式確實看得有點蛋疼,迷糊,不知道大家有沒有這感覺,其實和委託的概念類似,應用的場合在GUI應用上比較多,還有類似的訂閱服務,產品的降價通知客戶也可以考慮,但是我們都可以通過委託來更好的實現,如果找到合適的應用例子再貼上來吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.