一.介绍
观察者模式(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.使得目标对象和观察者对象解耦,如果需要添加新的观察者,只需要在抽象类上拓展并订阅即可。