行为型设计模式——观察者模式

观察者模式(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     }
View Code
 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  }
View Code

 

posted @ 2025-04-07 18:12  是铭不是明  阅读(100)  评论(1)    收藏  举报