設計模式----觀察者模式

守望陽光01發表於2019-04-27

        今天,我們來講講觀察者模式。。所謂觀察者模式就是一種觀察者的模式(哈哈),其實觀察者模式就一句話:物件和行為分離。。如果你理解了這句話,觀察者模式你就學會了,怎麼樣,是不是特別簡單。。額,如果不理解的話請看以下程式碼。。

abstract class Observer
    {
        public abstract void Update();
    }

        首先,觀察者模式,當然不能少了觀察者,Observer類就是我們抽象出來的觀察者,它只有一個方法Update,然後呢,前面我們不是說了嗎,觀察者模式核心就是物件和行為分離,既然物件有了,那麼行為也該出場了啊。。

abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();

        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();
            }
        }
    }

         Subject類就是我們的通知者,也就是我們所說的被觀察者,它有三個方法和一個list集合,Attach方法就是往集合中新增觀察物件,Detach方法就是往集合中減除觀察物件,而Notify方法是執行所有被觀察物件的Update方法,也就是修改狀態(這個就是行為,由被觀察者來通知觀察者並改變其狀態)。這些做完之後,我們就要開始去實現真正的觀察物件和通知物件了,請看程式碼

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; }
        }
    }



class ConcreteSubject : Subject
    {
        private string subjectState;

        //具體被觀察者狀態
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }

        我們首先看ConcreteObserver類,它繼承Observer類,所以它是具體觀察者,然後我們看ConcreteSubject類,它繼承Subject類,所以它是具體通知者。。我們接著看他們內部,首先是ConcreteSubject類,它只有一個屬性SubjectState,然後我們看ConcreteObserver類,首先是建構函式,它注入了具體通知者和name,然後重寫Update方法,修改修改自身狀態。好了,觀察者模式就寫完了,現在,讓我們來通過上層使用來全域性看看是如何運轉的

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("***********觀察者模式************");
            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();
        }
    }

        首先是new一個通知者,然後通知者新增觀察物件(它得知道有多少人在偷看它對吧),所有觀察者模式還有一個別名叫釋出--訂閱模式。ConcreteSubject就是釋出者,ConcreteObserver就是訂閱者,好,接下來我們就看看實現執行效果如何。。。

        這裡我們可以看到當我們改變釋出者狀態的時候,所有的觀察者狀態都得到了改變。。這樣我們的目的也就達到了,當我釋出東西的時候,我需要通知所有訂閱我的人我的狀態。。。

        物件和行為分離:所有的觀察者和通知者之間沒有必然的聯絡,觀察者只負責觀察(也就是訂閱),改變行為通知觀察者交給通知者統一管理。這就是我們今天的觀察者模式了。。。

 

相關文章