C#设计模式---观察者模式(Observer Pattern)

一、目的

提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象。

二、定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

三、场景

假设多个用户订阅了微信中的汽车之家公众号,当公众号有新车到来的时候,则会通知所有订阅该公众号的用户,下面用观察者模式来模拟这一场景。

四、实现

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace DesignMode_Observer
 5 {
 6     public interface IWechatAccountSubject
 7     {
 8         List<IObserver> ObserverList { get; set;}
 9         string SubjectName { get; set; }
10         string Message { get; set; }
11 
12         void AddObserver(IObserver ob);
13         void RemoveObserver(IObserver ob);
14         void Notify();
15 
16         void AddNewMsg(string pMsg);
17     }
18     public interface IObserver
19     {
20         string ObservertName { get; set; }
21         void ReceiveNewMessgage(IWechatAccountSubject subject);
22     }
23 
24     public class Observer : IObserver
25     {
26         public string ObservertName { get; set; }
27         public Observer(string pName)
28         {
29             this.ObservertName = pName;
30         }
31         public void ReceiveNewMessgage(IWechatAccountSubject subject)
32         {
33             Console.ForegroundColor = ConsoleColor.DarkGreen;
34             Console.WriteLine($"{ObservertName} received msg from {subject.SubjectName}:
{subject.Message}");
35         }
36     }
37     public class WeChatCarAccountSubject:IWechatAccountSubject
38     {
39         public List<IObserver> ObserverList { get; set; }
40         public string SubjectName { get; set; }
41         public string Message { get; set; }
42         public WeChatCarAccountSubject(string pSubjectName, string pMessage)
43         {
44             this.SubjectName = pSubjectName;
45             this.Message = pMessage;
46             ObserverList = new List<IObserver>();
47         }
48         public void AddObserver(IObserver ob)
49         {
50             ObserverList.Add(ob);
51         }
52         public void RemoveObserver(IObserver ob)
53         {
54             ObserverList.Remove(ob);
55         }
56 
57         public void Notify()
58         {
59             foreach (var ob in ObserverList)
60             {
61                 if (ob != null)
62                 {
63                     ob.ReceiveNewMessgage(this);
64                 }
65             }
66         }
67 
68         public void AddNewMsg(string pMsg)
69         {
70             Message += pMsg;
71         }
72     }
73 
74     class Program
75     {
76         static void Main(string[] args)
77         {
78             IObserver ob1 = new Observer("Mary");
79             IObserver ob2 = new Observer("Jack");
80             IWechatAccountSubject sub = new WeChatCarAccountSubject(nameof(WeChatCarAccountSubject), "New car Audi arrived
");
81             sub.AddObserver(ob1);
82             sub.AddObserver(ob2);
83             sub.Notify();
84 
85             sub.AddNewMsg("New car Bmw arrived
");
86 
87             sub.Notify();
88         }
89     }
90 }
View Code

运行结果如下:

五、类图

 

六、描述

从上图可以看出,在观察者模式的结构图有以下角色:

(1)抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类

    或接口实现。

(2)抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。

(3)具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。

(4)具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。

原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609453.html