观察者模式 本是古典 何须时尚 2021-12-09 00:47 278阅读 0赞 ## 前言 ## ** 观察者模式**又叫**发布-订阅(Publish/Subscribe)**模式 ** ** ** 观察者模式**定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者,使它们能够自己更新自己。 ## 一、观察者模式 ## 1、subject类,它吧所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者,抽象主题提供一个借口,可以增加和删除观察者对象。 1 /// <summary> 2 /// 主题或抽象通知者 3 /// </summary> 4 public abstract class Subject 5 { 6 //同事列表 7 private IList<Observer> observers = new List<Observer>(); 8 9 //增加 10 public void Attach(Observer observer) 11 { 12 observers.Add(observer); 13 } 14 //减少 15 16 public void Detach(Observer observer) 17 { 18 observers.Remove(observer); 19 20 } 21 //通知 22 public void Notify() 23 { 24 foreach (var i in observers) 25 i.Update(); 26 } 27 } 2、Observer类,抽象观察者,为所有具体观察者定义一个借口,在得到主题的通知时更新自己。抽象观察者一般用一个抽象类或者一个接口实现。 1 //抽象观察者 2 public abstract class Observer 3 { 4 public abstract void Update(); 5 } 3、ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。 1 public class ConcreteObserver : Observer 2 { 3 private string name; 4 private string observerState; 5 private ConcreteSubject subject; 6 public ConcreteObserver(ConcreteSubject subject,string name) 7 { 8 this.name = name; 9 this.subject = subject; 10 } 11 12 public override void Update() 13 { 14 observerState = subject.SubjectState; 15 Console.WriteLine("观察者{0}的新状态是{1}", name, observerState); 16 } 17 public ConcreteSubject Subject 18 { 19 get { return subject; } 20 set { subject = value; } 21 } 22 } 4、具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。 1 public class ConcreteSubject:Subject 2 { 3 4 private string action; 5 //前台状态 6 public string SubjectState 7 { 8 get { return action; } 9 set { action = value; } 10 } 11 } 5、客户端 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 #region 抽象模式 6 ConcreteSubject s = new ConcreteSubject(); 7 8 s.Attach(new ConcreteObserver(s, "X")); 9 s.Attach(new ConcreteObserver(s, "Y")); 10 s.Attach(new ConcreteObserver(s, "Z")); 11 12 s.SubjectState = "ABC"; 13 //发出通知 14 s.Notify(); 15 16 #endregion 17 18 Console.ReadKey(); 19 } 20 } ## 总结 ## 1、当一个对象的改变需要同时改变其他对象时,而且不需要知道具体有对少对象有改变,应考虑使用观察者模式。 2、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。 3、观察者模式所做的工作其实就是在解耦。让耦合的双方都依赖于抽象,而不依赖于具体,从而使得各自的变化都不会影响另一边的变化。这时依赖倒转原则的最佳体现。 **4、缺点:尽管已经用了依赖倒转原则,但是“抽象通知者”还是依赖“抽象观察者”,另外每个具体观察者,它不一定是“更新”的方法要调用** ## 二、事件委托实现 ## 1、观察者 1 public class StockObserver 2 { 3 private string name; 4 private string observerState; 5 private Subject subject; 6 public StockObserver(Subject subject, string name) 7 { 8 this.name = name; 9 this.subject = subject; 10 } 11 public void CloseStockMarket() 12 { 13 Console.WriteLine("{0}{1} 关闭股票行情,继续工作!",subject.SubjectState,name); 14 } 15 } 16 public class NBAObserver 17 { 18 private string name; 19 private string observerState; 20 private Subject subject; 21 public NBAObserver(Subject subject, string name) 22 { 23 this.name = name; 24 this.subject = subject; 25 } 26 public void CloseNBA() 27 { 28 Console.WriteLine("{0}{1} 关闭NBA直播,继续工作!", subject.SubjectState, name); 29 } 30 } 2、抽象通知者 1 public interface Subject 2 { 3 void Notify(); 4 string SubjectState { get; set; } 5 } 3、具体通知者 1 //声明一个委托,名称叫“EventHandler(事件处理程序)”,无参数,无返回值 2 public delegate void EventHandler(); 3 public class Boss : Subject 4 { 5 //声明一事件Update,类型为委托EventHandler 6 public event EventHandler Update; 7 private string action; 8 public string SubjectState 9 { 10 get 11 { 12 return action; 13 } 14 15 set 16 { 17 action = value; 18 } 19 } 20 //在访问“通知”方法时,调用“更新” 21 public void Notify() 22 { 23 Update(); 24 } 25 } 4、客户端 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Boss huhansan = new Boss(); 6 //看股票的同事 7 StockObserver tong1 = new StockObserver(huhansan,"小美"); 8 9 //看NBA的同事 10 NBAObserver tong2 = new NBAObserver(huhansan, "小花"); 11 12 13 huhansan.Update += new EventHandler(tong1.CloseStockMarket); 14 huhansan.Update += new EventHandler(tong2.CloseNBA); 15 //老板回来 16 huhansan.SubjectState = "我胡汉三回来了"; 17 //通知 18 huhansan.Notify(); 19 20 Console.ReadKey(); 21 } 22 } ## 总结 ## 1、委托就是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具体完全相同的行为。 2、委托方法的使用可以像其他任何方法一样,具有参数和返回值。 3、委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。 4、委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。 **参考书籍**:大话设计模式
相关 观察者模式 什么是观察者模式 有人这么说 > 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 > > 这个主题对象在状态上发生变化时,会通知所有观 梦里梦外;/ 2022年07月20日 12:05/ 0 赞/ 207 阅读
相关 观察者模式 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 观察者模式图: ![输入图片说明][13105107_Mf 旧城等待,/ 2022年06月03日 02:41/ 0 赞/ 210 阅读
相关 观察者模式 前言 观察者模式还算一个比较好玩的设计模式,其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。可以想象成消息中间件在系统中的作 墨蓝/ 2022年03月15日 06:48/ 0 赞/ 260 阅读
相关 观察者模式 类似于广播,目标对象的状态改变后,所有观察者的状态随之改变 步骤: 目标类中有一个属性是一个集合, 有一个注册方法,所有观察者使用前都要注册。 有一个 ╰半橙微兮°/ 2022年02月01日 15:43/ 0 赞/ 179 阅读
相关 观察者模式 什么是观察者模式? 简单的来说,观察者模式=出版者+订阅者。用比较书面的话来说的话是:定义了对象之间的一对多依赖,当一所对应的对象状态改变时,它的所有依赖者都会收到通知并 你的名字/ 2022年02月01日 13:53/ 0 赞/ 322 阅读
相关 观察者模式 前言 观察者模式又叫发布-订阅(Publish/Subscribe)模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个 本是古典 何须时尚/ 2021年12月09日 00:47/ 0 赞/ 279 阅读
相关 观察者模式 case ![18721752-ed32bda3ae538d1f.png][] image.png 非设计模式code SimpleWeatherDat 朱雀/ 2021年09月18日 07:26/ 0 赞/ 401 阅读
相关 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 意图:定义对象 系统管理员/ 2021年09月17日 01:36/ 0 赞/ 416 阅读
相关 观察者模式 15.观察者模式 ![70][] public abstract class Blog// 订阅号抽象类 { priva 布满荆棘的人生/ 2021年09月17日 00:04/ 0 赞/ 374 阅读
相关 观察者模式 一 点睛 定义 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态 ﹏ヽ暗。殇╰゛Y/ 2021年07月24日 14:52/ 0 赞/ 410 阅读
还没有评论,来说两句吧...