觀察者模式也稱做發佈/訂閱模式,提供了一種做用於任何實現了訂閱者接口的對象的機制, 可對其事件進行訂閱和取消訂閱。this
假如你有兩種類型的對象: 顧客和商店。顧客但願商店某些商品有優惠信息的時候能夠通知顧客。在這個例子中商店就是發佈者,顧客就是訂閱者。商店發佈通知,維護訂閱及取消訂閱對象,若是顧客訂閱了,則商店發佈通知後顧客進行相應的處理。code
首先,聲明訂閱者接口。server
//聲明訂閱者接口。 public interface IObserver { // 通知後處理 void Handle(ISubject subject); }
而後,聲明發布者接口並定義一些接口來在列表中添加和刪除訂閱對象。對象
public interface ISubject { // 訂閱 void Subscribe(IObserver observer); // 取消訂閱 void Unsubscribe(IObserver observer); // 發佈 void Publish(); }
接着,建立具體發佈者類。接口
//建立具體發佈者類。 public class Subject : ISubject { private List<IObserver> _observers = new List<IObserver>(); public void Subscribe(IObserver observer) { this._observers.Add(observer); } public void Unsubscribe(IObserver observer) { this._observers.Remove(observer); } public void Publish() { Console.WriteLine("商店發佈優惠通知!"); foreach (var observer in _observers) { observer.Handle(this); } } }
接着,建立具體顧客類,顧客A和顧客B。事件
//具體訂閱者類中實現通知後處理的方法。 public class CustomerA : IObserver { public void Handle(ISubject subject) { Console.WriteLine("顧客A收到優惠通知。"); } } public class CustomerB : IObserver { public void Handle(ISubject subject) { Console.WriteLine("顧客B收到優惠通知。"); } }
最後,建立客戶端類。string
//客戶端必須生成所需的所有訂閱者, 並在相應的發佈者處完成註冊工做。 class Program { static void Main(string[] args) { var subject = new Subject(); var observerA = new CustomerA(); subject.Subscribe(observerA); var observerB = new CustomerB(); subject.Subscribe(observerB); subject.Publish(); Console.WriteLine(); subject.Unsubscribe(observerB); subject.Publish(); Console.ReadKey(); } }
讓咱們來看看輸出結果:it
商店發佈優惠通知! 顧客A收到優惠通知。 顧客B收到優惠通知。 商店發佈優惠通知! 顧客A收到優惠通知。
.NET的事件模型是一種典型的觀察者模型,代碼相對來講更加簡潔。io
//建立具體發佈者類。 public class Subject { public event Action Handles; public void Publish() { Console.WriteLine("商店發佈優惠通知!"); Handles?.Invoke(); } } //具體訂閱者類中實現通知後處理的方法。 public class CustomerA { public void Handle() { Console.WriteLine("顧客A收到優惠通知。"); } } public class CustomerB { public void Handle() { Console.WriteLine("顧客B收到優惠通知。"); } } class Program { static void Main(string[] args) { var subject = new Subject(); var observerA = new CustomerA(); subject.Handles += observerA.Handle; var observerB = new CustomerB(); subject.Handles += observerB.Handle; subject.Publish(); Console.WriteLine(); subject.Handles -= observerB.Handle; subject.Publish(); Console.ReadKey(); } }
讓咱們來看看輸出結果:event
商店發佈優惠通知! 顧客A收到優惠通知。 顧客B收到優惠通知。 商店發佈優惠通知! 顧客A收到優惠通知。