讀書筆記12:觀察者模式

來源:互聯網
上載者:User

 

1、概念

定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一主題對象,這個主題的狀態發生變化是就通知所有的觀察者對象,是這些觀察者自動更新自己。

2、角色

觀察者(Observer)—觀察者有一個更新自己狀態的方法,當它觀察的那個主題的裝太發生了變化,主題會通知這些觀察者,觀察者接到通知後更新自己的狀態。所以觀察者有一個Update()方法。

主題(Subject)—主題包含多個觀察者,就有ADD和REMOVE觀察者的方法。該主題的狀態改變了需要通知那些觀察者,所以還有一個Notify()方法。

3、代碼模型

模型類

using System;using System.Collections.Generic;using System.Text;namespace ObserverPattern{    public class Subject    {        private List<Observer> observers = new List<Observer>();        public void AddObserver(Observer observer)        {            observers.Add(observer);        }         public void RemoveObserver(Observer observer)        {            observers.Remove(observer);        }        public void Notify()        {            foreach (Observer observer in observers)            {                observer.Update();            }        }    }    public abstract class Observer    {        public abstract void Update();    }    public class SubstanceSubject : Subject    {        private string currentSubjectState;         public string CurrentSubjectState        {            get { return currentSubjectState; }            set { currentSubjectState = value; }        }    }    public class SubstanceObserver : Observer    {        private string observerName;        private object observerState;         private SubstanceSubject currentSubstanceSubject;        public SubstanceObserver(SubstanceSubject subject ,string name)        {            this.currentSubstanceSubject = subject;            this.observerName = name;        }         public override void Update()        {            observerState = currentSubstanceSubject.CurrentSubjectState;            Console.WriteLine("觀察者 {0} 的狀態是 {1}", observerName, observerState);        }        public SubstanceSubject CurrentSubstanceSubject        {            get { return currentSubstanceSubject; }            set { currentSubstanceSubject = value; }        }    }}

調用

using System;using System.Collections.Generic;using System.Text;namespace ObserverPattern{    class Program    {        static void Main(string[] args)        {            SubstanceSubject sub = new SubstanceSubject();            SubstanceObserver suo1 = new SubstanceObserver(sub,"甲");            SubstanceObserver suo2 = new SubstanceObserver(sub,"乙");            SubstanceObserver suo3 = new SubstanceObserver(sub,"丙");            sub.AddObserver(suo1);            sub.AddObserver(suo2);            sub.AddObserver(suo3);            sub.CurrentSubjectState = "閑著沒事幹";            sub.Notify();             Console.WriteLine();            Console.WriteLine("改變狀態,當前主題的所有觀察者的狀態都要更新:");            Console.WriteLine();            sub.CurrentSubjectState = "忙得昏天黑地";            sub.Notify();            Console.ReadLine();        }    }}

結果

 

觀察者模式主要是用於某一處狀態的改變需要讓其他不同的地方知道的情況下。最常見的就是在做表單項目中,表單中的某個控制項我們可以用+=給他添加系統內建的事件比如按鈕,

this.button.Click += new System.EventHandler(執行的方法1);我們可以給這個Click事件加很多方法this.button.Click += new System.EventHandler(執行的方法2);這就是觀察者模式的應用。同時我們可以寫自己的事件MyEventHandler,則有

this.button.Click += new MyEventHandler (執行的方法3);

   當然,這是.net類庫已經實現好了的,在我們的實際項目中,可以按照上述的模型使用。只需建立好兩個角色,做好實現。就解決那種“一處變化多處響應”的需求了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.