一、目的
提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象。
二、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
三、场景
假设多个用户订阅了微信中的汽车之家公众号,当公众号有新车到来的时候,则会通知所有订阅该公众号的用户,下面用观察者模式来模拟这一场景。
四、实现
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}:\n{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\n"); 81 sub.AddObserver(ob1); 82 sub.AddObserver(ob2); 83 sub.Notify(); 84 85 sub.AddNewMsg("New car Bmw arrived\n"); 86 87 sub.Notify(); 88 } 89 } 90 }
运行结果如下:
五、类图
六、描述
从上图可以看出,在观察者模式的结构图有以下角色:
(1)抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类
或接口实现。
(2)抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。
(3)具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。
(4)具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。
原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609453.html
时间: 2024-10-09 06:26:37