觀察者模式(又叫釋出-訂閱模式)

fan_rockrock發表於2016-04-08

原理:

        定義物件間的一種一對多依賴關係使得每當一個物件(通知者)狀態發生改變時,其相關依賴物件(觀察者)皆得到通知並被自動更新


    //通知者介面
    interface Subject
    {
        void Attach(Observer observer);
        void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }

class Secretary : Subject//祕書作為通知者
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //減少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
                o.Update();
        }
        //前臺狀態
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }

class Boss : Subject//老闆作為通知者
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //減少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
                o.Update();
        }
        //老闆狀態
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }

 //抽象觀察者
    abstract class Observer
    {
        protected string name;
        protected Secretary sub;

        public Observer(string name, Secretary sub)
        {
            this.name = name;
            this.sub = sub;
        }

        public abstract void Update();
    }

//看股票的同事
    class StockObserver : Observer
    {
        public StockObserver(string name, Secretary sub) : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 關閉股票行情,繼續工作!", sub.SecretaryAction, name);
        }
    }

    //看NBA的同事
    class NBAObserver : Observer
    {
        public NBAObserver(string name, Secretary sub)  : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 關閉NBA直播,繼續工作!", sub.SecretaryAction, name);
        }
    }

static void Main(string[] args)
        {
            //老闆胡漢三
            Boss huhansan = new Boss();

            //看股票的同事
            StockObserver tongshi1 = new StockObserver("魏關奼", huhansan);
            //看NBA的同事
            NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);

            huhansan.Attach(tongshi1);
            huhansan.Attach(tongshi2);

            huhansan.Detach(tongshi1);

            //老闆回來
            huhansan.SubjectState = "我胡漢三回來了!";
            //發出通知
            huhansan.Notify();

            Console.Read();
        }

實際過程中,使用者介面可以作為一個觀察者(可以有多個),業務資料可以是通知者(可以有多個),使用者介面觀察業務資料的變化,當發現資料變化時,就顯示在介面上

相關文章