动态

详情 返回 返回

行為型設計模式——觀察者模式 - 动态 详情

觀察者模式(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

 

Add a new 评论

Some HTML is okay.