读书笔记12:观察者模式
1、概念
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题的状态发生变化是就通知所有的观察者对象,是这些观察者自动更新自己。
2、角色
观察者(Observer)—观察者有一个更新自己状态的方法,当它观察的那个主题的装太发生了变化,主题会通知这些观察者,观察者接到通知后更新自己的状态。所以观察者有一个Update()方法。
主题(Subject)—主题包含多个观察者,就有ADD和REMOVE观察者的方法。该主题的状态改变了需要通知那些观察者,所以还有一个Notify()方法。
3、代码模型
模型类
using System; using System.Collections.Generic; using System.Text; namespace ObserverPattern { public class Subject { private List<Observer> observers = new List<Observer>(); public void AddObserver(Observer observer) { observers.Add(observer); } public void RemoveObserver(Observer observer) { observers.Remove(observer); } public void Notify() { foreach (Observer observer in observers) { observer.Update(); } } } public abstract class Observer { public abstract void Update(); } public class SubstanceSubject : Subject { private string currentSubjectState; public string CurrentSubjectState { get { return currentSubjectState; } set { currentSubjectState = value; } } } public class SubstanceObserver : Observer { private string observerName; private object observerState; private SubstanceSubject currentSubstanceSubject; public SubstanceObserver(SubstanceSubject subject ,string name) { this.currentSubstanceSubject = subject; this.observerName = name; } public override void Update() { observerState = currentSubstanceSubject.CurrentSubjectState; Console.WriteLine("观察者 {0} 的状态是 {1}", observerName, observerState); } public SubstanceSubject CurrentSubstanceSubject { get { return currentSubstanceSubject; } set { currentSubstanceSubject = value; } } } }
调用
using System; using System.Collections.Generic; using System.Text; namespace ObserverPattern { class Program { static void Main(string[] args) { SubstanceSubject sub = new SubstanceSubject(); SubstanceObserver suo1 = new SubstanceObserver(sub,"甲"); SubstanceObserver suo2 = new SubstanceObserver(sub,"乙"); SubstanceObserver suo3 = new SubstanceObserver(sub,"丙"); sub.AddObserver(suo1); sub.AddObserver(suo2); sub.AddObserver(suo3); sub.CurrentSubjectState = "闲着没事干"; sub.Notify(); Console.WriteLine(); Console.WriteLine("改变状态,当前主题的所有观察者的状态都要更新:"); Console.WriteLine(); sub.CurrentSubjectState = "忙得昏天黑地"; sub.Notify(); Console.ReadLine(); } } }
结果
观察者模式主要是用于某一处状态的改变需要让其他不同的地方知道的情况下。最常见的就是在做窗体项目中,窗体中的某个控件我们可以用+=给他添加系统自带的事件比如按钮,
this.button.Click += new System.EventHandler(执行的方法1);我们可以给这个Click事件加很多方法this.button.Click += new System.EventHandler(执行的方法2);这就是观察者模式的应用。同时我们可以写自己的事件MyEventHandler,则有
this.button.Click += new MyEventHandler (执行的方法3);
当然,这是.net类库已经实现好了的,在我们的实际项目中,可以按照上述的模型使用。只需建立好两个角色,做好实现。就解决那种“一处变化多处响应”的需求了。
转载于:https://blog.51cto.com/yangyoushan/1276883
读书笔记12:观察者模式相关推荐
- 《深入浅出图神经网络》读书笔记 1-2
<深入浅出图神经网络>读书笔记 1-2 第1章 图的概述 第2章 神经网络基础 2.1 机器学习基本概念 2.2 神经网络 2.4 训练神经网络 第1章 图的概述 图神经网络(Graph ...
- 《JavaScript高级程序设计》读书笔记 -12.1 window对象
<JavaScript高级程序设计>读书笔记 -12.1 window对象 12.1 window对象 12.1.1 Global作用域 12.1.2 窗口关系[不是很懂] 12.1.3 ...
- 《JavaScript设计模式与开发实践》读书笔记之观察者模式
1.观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观 ...
- CLR via C# 读书笔记 1-2 创建线程的成本
在clr中创建线程的代价还是比较高的 ,他需要两个部分 内存: 线程核心对象, 存放描述线程的一些内容和上下文 . (内存消耗:700B-2500B) 线程环境,存放例如异常处理链之类. (内存消耗 ...
- Head First设计模式读书笔记二 观察者模式
本文示例代码材料源自Head First设计模式 以前整理自己整理的观察者模式的链接: https://blog.csdn.net/u011109881/article/details/5977304 ...
- 大话设计模式读书笔记之观察者模式
1.定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 2.UML类图 3.简单代码实现: ...
- Programming in Scala (Second Edition) 读书笔记12 Trais
1.什么是Trait ? Traits are a fundamental unit of code reuse in Scala. A trait encapsulates method and f ...
- APUE读书笔记-12线程控制-04同步属性
转载于:https://blog.51cto.com/quietheart/818811
- 线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12
上一篇聊了聊构建分布式系统所面临的困难,这篇将着重讨论构建容错分布式系统的算法与协议.构建容错系统的最佳方法是使用通用抽象,允许应用程序忽略分布式系统中的一些问题.本篇我们先聊一聊线性一致性,以及与线 ...
最新文章
- 【TeeChart Pro ActiveX教程】(八):ADO数据库访问(上)
- asp.net html 加密解密,三种方法还原ASP.NET可逆加密内容
- Apache 2.2 虚拟主机配置(本人推荐的)
- 小程序·云开发,属于小程序的全栈开发机遇
- dj鲜生-38-项目上线简介-从本地小项目到云服务的调试
- MySQL数据库基本操作1
- vue(vue-cli+vue-router)+babel+webpack项目搭建入门 (第一步)
- 乐檬:我们和fiil主题词相同是撞车!汪峰信吗?
- 2022-10-10更新步数接口和快捷指令
- 服务器注册表被管理员禁用,win10中如何修复被管理员或病毒禁用的注册表编辑器...
- codeforces 56E 多米诺骨牌效应
- SpringCloud 微服务网关Gateway常用限流算法以及简单实现
- php如何与微信公众平台连接失败,微信公众平台接入问题,配置失败不知道是哪的原因?...
- 2022河南萌新联赛第(二)场:河南理工大学(赛后总结)
- 整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶
- 《推荐系统实践》__第1章__好的推荐系统
- Spring框架——加载属性(properties)文件
- Ubuntu系统安装CUDA或NVIDIA驱动后出现循环登录问题的Solution (附:building kernel modules error)
- FreeBSD 更新
- 【M32】单片机 xxx.map 文件简单解读