观察者模式

发布时间 2023-10-20 10:53:11作者: 子凡。翅膀
定义:对象之间一对多的依赖关系,当对象发生改变时,其依赖对象都得到通知并自动更新。也被称为发布/订阅模式。
特点:
  1. 抽象主题:将所有的观察者的引用保存到一个集合内,每个主题内保存着观察者,并提供一个接口进行对观察者的删除添加。
  2. 具体主题:将有关状态存入具体观察者对象,当具体主题发生变化时,给所有观察者发送通知消息。
  3. 抽象观察者:为所有的具体观察者定义接口,得到主题通知时更新。
  4. 具体观察者:实现抽象观察者所要求的的更新接口,使本身状态主题协调。
 
优点:降低耦合性,观察者与被观察者通过抽象解耦。
缺点:时间复杂度增高,当有多个观察者时会增加时间复杂度。
          内连不足,
          容易出现循环调用
 
 
 
 1 // 订阅号抽象类
 2     public abstract class Blog
 3     {
 4         // 保存订阅者列表
 5         private List observers = new Listbserver>();
 6  
 7         public string Symbol { get; set; }//描写订阅号的相关信息
 8         public string Info { get; set; }//描写此次update的信息
 9         public Blog(string symbol, string info)
10         {
11             this.Symbol = symbol;
12             this.Info = info;
13         }
14  
15         // 对同一个订阅号,新增和删除订阅者的操作
16         public void AddObserver(IObserver ob)
17         {
18             observers.Add(ob);
19         }
20         public void RemoveObserver(IObserver ob)
21         {
22             observers.Remove(ob);
23         }
24  
25         public void Update()
26         {
27             // 遍历订阅者列表进行通知
28             foreach (IObserver ob in observers)
29             {
30                 if (ob != null)
31                 {
32                     ob.Receive(this);
33                 }
34             }
35         }
36     }
37  
38     // 具体订阅号类
39     public class MyBlog : Blog
40     {
41         public MyBlog(string symbol, string info)
42             : base(symbol, info)
43         {
44         }
45     }
46  
47     // 订阅者接口
48     public interface IObserver
49     {
50         void Receive(Blog tenxun);
51     }
52  
53     // 具体的订阅者类
54     public class Subscriber : IObserver
55     {
56         public string Name { get; set; }
57         public Subscriber(string name)
58         {
59             this.Name = name;
60         }
61  
62         public void Receive(Blog xmfdsh)
63         {
64             Console.WriteLine("订阅者 {0} 观察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
65         }
66     }
67  
68     // 客户端测试
69     class Program
70     {
71         static void Main(string[] args)
72         {
73             Blog xmfdsh = new MyBlog("xmfdsh", "发布了一篇新博客");
74  
75             // 添加订阅者
76             xmfdsh.AddObserver(new Subscriber("王尼玛"));
77             xmfdsh.AddObserver(new Subscriber("唐马儒"));
78             xmfdsh.AddObserver(new Subscriber("王蜜桃"));
79             xmfdsh.AddObserver(new Subscriber("敖尼玛"));
80  
81             //更新信息
82             xmfdsh.Update();
83             //输出结果,此时所有的订阅者都已经得到博客的新消息
84             Console.ReadLine();
85         }
86     }
87