博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之观察者模式
阅读量:6861 次
发布时间:2019-06-26

本文共 3216 字,大约阅读时间需要 10 分钟。

UML类图:

 

举一个生活中的例子:假如一个写字楼的员工定了外卖。是定外卖的人每10分钟就到楼下转一圈儿看外卖到了。还是送外卖的小哥一个个工位的送过去?

都不是。

实际上外卖小哥到了写字楼楼下给每个员工打电话,员工就会下楼拿着自己外卖上楼。

实际上,这就是一个观察者模式。外卖小哥到写字楼楼下--》自己的状态改变了---》通过手机通知所有的观察者

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

  • Subject:抽象主题,抽象主题里包含了一个list,这个list是所有的observer,你可以通过atach添加一个observer,也可以通过detach删掉一个observer。还包含了一个

Notify函数,这个函数可以调用所有observer的update函数,来更新自己的状态。

  • Observer:为所有的具体观察者提供了一个接口update。
  • ConcreteSubject:具体主题,也就是具体的被观察者。里面包含了自己的state信息。
  • ConcreteObserver:具体的观察者,观察者里面可以包含一个所相关的主题对应的state信息,以及一个实现了的update函数,当调用这个update函数时候,修改自己的state信息。举一个例子,假如被观察是消费者,当消费者已经付钱,表示状态变化,观察者1——出纳员的state改变就是登记入账,观察者2——会计来开发票,观察者3——配送员来发货。

 

///     /// 抽象主题类    ///     public abstract class Subject    {        private IList
observers = new List
(); ///
/// 增加观察者 /// ///
public void Attach(Observer observer) { observers.Add(observer); } ///
/// 移除观察者 /// ///
public void Detach(Observer observer) { observers.Remove(observer); } ///
/// 向观察者(们)发出通知 /// public void Notify() { foreach (Observer o in observers) { o.Update(); } } } ///
/// 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己 /// public abstract class Observer { public abstract void Update(); } ///
/// 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。 /// public class ConcreteSubject : Subject { private string subjectState; ///
/// 具体观察者的状态 /// public string SubjectState { get { return subjectState; } set { subjectState = value; } } } ///
/// 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调 /// public class ConcreteObserver : Observer { private string observerState; private string name; private ConcreteSubject subject; ///
/// 具体观察者用一个具体主题来实现 /// public ConcreteSubject Subject { get { return subject; } set { subject = value; } } public ConcreteObserver(ConcreteSubject subject, string name) { this.subject = subject; this.name = name; } ///
/// 实现抽象观察者中的更新操作 /// public override void Update() { observerState = subject.SubjectState; Console.WriteLine("The observer's state of {0} is {1}", name, observerState); } }

 

客户端:

class Program    {        static void Main(string[] args)        {            // 具体主题角色通常用具体自来来实现            ConcreteSubject subject = new ConcreteSubject();            subject.Attach(new ConcreteObserver(subject, "Observer A"));            subject.Attach(new ConcreteObserver(subject, "Observer B"));            subject.Attach(new ConcreteObserver(subject, "Observer C"));            subject.SubjectState = "Ready";            subject.Notify();            Console.Read();        }    }

 

转载于:https://www.cnblogs.com/LUO77/p/5785472.html

你可能感兴趣的文章
IntelliJ IDEA使用
查看>>
架构师速成4.1-幼儿园要学会如何学习(转载自36氪) 分类: 架构师速成 ...
查看>>
《C程序猿:从校园到职场》出版预告(4):从“散兵游勇”到“正规部队”
查看>>
mysql安装
查看>>
云虚机选购指南之三云虚拟主机额外增加空间流程
查看>>
Delphi 中的 procedure of object
查看>>
.NET中RabbitMQ的使用
查看>>
对我们团队NBPL的改进方案意见
查看>>
关于WebResource管理资源,自定义控件嵌入js文件资源
查看>>
学习C++要多久? 是时间的问题吗?
查看>>
配置虚拟主机
查看>>
sonar排除实体类配置
查看>>
机器学习过程中欠拟合和过拟合的诊断及解决方法
查看>>
解决apache启动错误"httpd:Could not reliably determine..."
查看>>
mysql命令总结
查看>>
Java8-dateTimeFormatter
查看>>
算法第5章作业
查看>>
直接下载完整chrome浏览器的方法
查看>>
如何使用ZEROBRANE STUDIO远程调试COCOS2D-X的LUA脚本(转)
查看>>
Git 1.9.5.msysgit.1
查看>>