文章出處

在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……

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

1.觀察者模式應用

  定義抽象通知者(主題)和抽象觀察者,抽象通知者負責增加、移除和通知抽象觀察者,抽象觀察者得到通知的時候更新自己

    /// <summary>
    /// 主題或者抽象通知者
    /// </summary>
    public abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();

        /// <summary>
        /// 增加觀察者
        /// </summary>
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        /// <summary>
        /// 移除觀察者
        /// </summary>
        /// <param name="observer"></param>
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        /// <summary>
        /// 通知觀察者
        /// </summary>
        public void Notify()
        {
            foreach (var v in observers)
            {
                v.Update();
            }
        }
    }

    /// <summary>
    /// 抽象觀察者(為所有具體觀察者定義的一個接口,在得到主題通知時更新自己)
    /// </summary>
    public abstract class Observer
    {
        public abstract void Update();
    }

   定義具體通知者(主題)和具體觀察者,具體觀察者實現具體業務

    /// <summary>
    /// 具體主題或者通知者
    /// </summary>
    public class ConcreteSubject : Subject
    {
        public string SubjectState { get; set; }
    }

    /// <summary>
    /// 具體觀察者
    /// </summary>
    public class ConcreteObserver : Observer
    {
        private string _name;

        public ConcreteSubject Subject { get; set; }

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this._name = name;
            this.Subject = subject;
        }

        public override void Update()
        {
            Console.WriteLine("觀察者{0}:通知者發來最新消息【{1}】", this._name, this.Subject.SubjectState);
        }
    }

   開啟場景模擬

        static void Main(string[] args)
        {
            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();
        }

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()