今天,我們來講講觀察者模式。。所謂觀察者模式就是一種觀察者的模式(哈哈),其實觀察者模式就一句話:物件和行為分離。。如果你理解了這句話,觀察者模式你就學會了,怎麼樣,是不是特別簡單。。額,如果不理解的話請看以下程式碼。。
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就是訂閱者,好,接下來我們就看看實現執行效果如何。。。
這裡我們可以看到當我們改變釋出者狀態的時候,所有的觀察者狀態都得到了改變。。這樣我們的目的也就達到了,當我釋出東西的時候,我需要通知所有訂閱我的人我的狀態。。。
物件和行為分離:所有的觀察者和通知者之間沒有必然的聯絡,觀察者只負責觀察(也就是訂閱),改變行為通知觀察者交給通知者統一管理。這就是我們今天的觀察者模式了。。。