行为型设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,通过定义对象间一对多的依赖关系实现状态变化的自动通知机制,广泛应用于解耦事件发布与订阅场景
适用于
①当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立地对象中以使它们可以各自独立地改变和复用。
②当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
③当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的。
类图如下:

场景:气象局监测温度
核心代码如下:
1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 //Console.WriteLine("Hello, World!"); 6 //创建具体观察者 7 DisPlay1 disPlay1 = new DisPlay1("显示屏1"); 8 DisPlay2 disPlay2 = new DisPlay2("显示屏2"); 9 //创建具体被观察者 10 WeatherData weatherData = new WeatherData(); 11 weatherData.RedisterObserver(disPlay1); 12 weatherData.RedisterObserver(disPlay2); 13 float temperature = 25; 14 weatherData.SetTemperature(temperature); 15 Console.ReadKey(); 16 } 17 }
1 internal interface Observer 2 { 3 /// <summary> 4 /// 观察者接口 5 /// </summary> 6 /// <param name="temp">监测对象,具体场景,具体定义参数</param> 7 /// 场景:气象局监测温度 8 void Update(float temp); 9 }
1 /// <summary> 2 /// 显示屏 3 /// </summary> 4 internal class DisPlay1 : Observer 5 { 6 private string Name { get; set; } 7 public DisPlay1(string name) 8 { 9 this.Name = name; 10 } 11 public void Update(float temp) 12 { 13 Console.WriteLine($"{Name}当前温度为{temp}摄氏度"); 14 } 15 }
1 /// <summary> 2 /// 显示屏 3 /// </summary> 4 internal class DisPlay2 : Observer 5 { 6 private string Name { get; set; } 7 public DisPlay2(string name) 8 { 9 this.Name = name; 10 } 11 public void Update(float temp) 12 { 13 Console.WriteLine($"{Name}当前温度为{temp}摄氏度"); 14 } 15 }
1 internal interface Subject 2 { 3 /// <summary> 4 /// 注册观察者 5 /// </summary> 6 /// <param name="observer"></param> 7 void RedisterObserver(Observer observer); 8 /// <summary> 9 /// 删除观察者 10 /// </summary> 11 /// <param name="observer"></param> 12 void RemoveObserver(Observer observer); 13 /// <summary> 14 /// 通知观察者 15 /// </summary> 16 void NoticeObserver(); 17 }
1 /// <summary> 2 /// 气象站 3 /// </summary> 4 internal class WeatherData : Subject 5 { 6 private List<Observer> observers; 7 private float temperature; 8 9 public WeatherData() 10 { 11 observers = new List<Observer>(); 12 } 13 public void SetTemperature(float temperature) 14 { 15 this.temperature = temperature; 16 NoticeObserver(); 17 } 18 public void NoticeObserver() 19 { 20 observers.ForEach(s => s.Update(temperature)); 21 } 22 23 public void RedisterObserver(Observer observer) 24 { 25 //if (observers == null) { } 26 observers.Add(observer); 27 } 28 29 public void RemoveObserver(Observer observer) 30 { 31 observers.Remove(observer); 32 } 33 }

浙公网安备 33010602011771号