剧拧并 发表于 2025-6-6 14:54:29

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

观察者模式(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>
4internal 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 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 行为型设计模式——观察者模式