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


一.介紹  

  觀察者模式(Observer Pattern)。屬於行為型模式。它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

二.實現

  舉個例子,我們開車時,當踩油門加速的時候,顯示器上會顯示車速,而超速的話,警報器會發出警報。車只是在加速,而顯示器和警報器卻可以監聽到車速的變化。

//系統
public abstract class System
{
    //加速,踩油門
    public abstract void Accelerate(int speed);
}

//顯示器
public class Screen : System
{
    public override void Accelerate(int speed)
    {
        Console.WriteLine("車速" + speed);
    }
}

//警報鈴
public class Alarm : System
{
    public override void Accelerate(int speed)
    {
        if (speed >= 100)
        {
            Console.WriteLine("嗶嗶,已經超速");
        }
    }
}

//交通工具
public abstract class Vehicle
{
    public List<System> systems = new List<System>();
    //裝系統
    public void Attach(System obs)
    {
        systems.Add(obs);
    }
    //卸載系統
    public void Detach(System obs)
    {
        systems.Remove(obs);
    }
    public void Notify(int speed)
    {
        systems.ForEach(o => o.Accelerate(speed));
    }
}

//汽車
public class Car : Vehicle
{
    private int speed;//速度
    protected void Accelerate(int speed)
    {
        base.Notify(speed);
    }

    //開車
    public void Go()
    {
        for (int i = 0; i <= 99; i++)
        {
            speed = i + 1;
            if (speed > 95)
            {
                Accelerate(speed);
            }
        }
    }
}

//調用
public static void Main(string[] args)
{
    Car car = new Car();
    System screen = new Screen();
    System alarm = new Alarm();
    car.Attach(screen);//開啟顯示器
    car.Attach(alarm);//開啟警報器
    car.Go();
}

  汽車Car作為發布信息的主體,系統System如顯示器、警報器則監聽汽車的信息。為了降低耦合,汽車使用“發布-訂閱”的方式,而不是直接調用系統的方法。Car用訂閱列表來存放需要使用的系統,等需要發布的時候,再通知到已經訂閱的各個系統中。

  在C#中,我們還可以使用委托和事件的方式去實現觀察者模式,委托就相當訂閱列表,當目標觸發了委托之中的事件時,則委托就會自動去調用觀察者注冊的方法。

//交通工具
public abstract class Vehicle
{
    public delegate void Handler(int speed);//定義委托類型

    public event Handler Event;//綁定委托的事件 

    //裝系統
    public void Attach(System obs)
    {
        Event += obs.Accelerate;//在委托中增加方法
    }
    //卸載系統
    public void Detach(System obs)
    {
        Event -= obs.Accelerate;//在委托中減少方法
    }
    public void Notify(int speed)
    {
        if (Event != null)
        {
            Event(speed);
        }
    }
}
//。。。
//其它代碼實現和上面例子一樣

3.總結

  優點:

  1.將一個目標對象的變化通知到觀察者類。

  2.使得目標對象和觀察者對象解耦,如果需要添加新的觀察者,只需要在抽象類上拓展並訂閱即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM