什麼是觀察者模式

1 定義

觀察者模式也稱做發佈/訂閱模式,提供了一種做用於任何實現了訂閱者接口的對象的機制, 可對其事件進行訂閱和取消訂閱。this

2 例子

假如你有兩種類型的對象: 顧客和商店。顧客但願商店某些商品有優惠信息的時候能夠通知顧客。在這個例子中商店就是發佈者,顧客就是訂閱者。商店發佈通知,維護訂閱及取消訂閱對象,若是顧客訂閱了,則商店發佈通知後顧客進行相應的處理。code

3 實現

首先,聲明訂閱者接口。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收到優惠通知。

4 用.NET的事件模型來實現

.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收到優惠通知。
相關文章
相關標籤/搜索