观察者模式

设计模式之观察者模式

南笙酒味 提交于 2019-12-27 18:53:39
观察者模式的定义 定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。 好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。 看一张图: 编码实现 首先开始写我们的主题接口,和观察者接口: package observer ; //主题接口 public interface Subject { /** * 注册一个观察者 * @param observer */ public void registerObserver ( Observer observer ) ; /** * 删除一个观察者 * @param observer */ public void removeObserver ( Observer observer ) ; /** * 通知所有观察者 */ public void notifyObserver ( ) ; } 观察者接口: package observer ; /** * 所有观察者都需要实现此接口 */ public interface Observer { public void update ( String msg ) ; } 然后我们以微信公众号发布订阅消息为例: package observer ; import java .

从一道面试题简单谈谈发布订阅和观察者模式

那年仲夏 提交于 2019-12-27 08:34:38
今天的话题是 javascript 中常被提及的「发布订阅模式和观察者模式」,提到这,我不由得想起了一次面试。记得在去年的一次求职面试过程中,面试官问我,“你在项目中是怎么处理非父子组件之间的通信的?”。我答道,“有用到 vuex ,有的场景也会用 EventEmitter2 ”。面试官继续问,“那你能手写代码,实现一个简单的 EventEmitter 吗?” 手写EventEmitter 我犹豫了一会儿,想到使用 EventEmitter2 时,主要是用 emit 发事件,用 on 监听事件,还有 off 销毁事件监听者, removeAllListeners 销毁指定事件的所有监听者,还有 once 之类的方法。考虑到时间关系,我想着就先实现发事件,监听事件,移除监听者这几个功能。当时可能有点紧张,不过有惊无险,在面试官给了一点提示后,顺利地写出来了!现在把这部分代码也记下来。 class EventEmitter { constructor() { // 维护事件及监听者 this.listeners = {} } /** * 注册事件监听者 * @param {String} type 事件类型 * @param {Function} cb 回调函数 */ on(type, cb) { if (!this.listeners[type]) { this.listeners

RxJava2.0 源码剖析

和自甴很熟 提交于 2019-12-26 23:14:24
RxJava2.0 源码剖析 一.Observable(被观察者/发射器) 二.Subscribe(订阅事件) 三.Observer(观察者) 这里我们先以一个最基础的使用case,来分析RxJava的实现原理。 Observable . create ( ObservableOnSubscribe < Int > { emitter -> ( 1 .. 3 ) . forEach { emitter . onNext ( it ) } } ) . map { i -> "I am value $i " } . subscribeOn ( Schedulers . io ( ) ) . observeOn ( AndroidSchedulers . mainThread ( ) ) . subscribe { str -> log ( str ) } 这个例子很简单:在IO线程中,发射器(被观察者)连续发射数字1,2,3,经过map转换为字符串,最后在主线程中进行输出即可。 RxJava的实现思想就是流式传递和观察者模式,下面我们以这两种模式的实现思路,来看下源码是如何实现的。 一.Observable(被观察者/发射器) Observable是被观察者,是发起活动的对象。 先看这段代码 Observable.create(ObservableOnSubscribe<Int> {}

各类数据拉取---观察者模式

早过忘川 提交于 2019-12-25 13:19:54
一:定义通知者(notice) 和 观察者(observer) 两个接口 PullCustDataNotice.java: //拉取数据通知者接口 public interface PullCustDataNotice { void removeObserver(PullCustDataObserver observer); void addObserver(PullCustDataObserver observer); void notice(Map<String,Object> map); } PullCustDataObserver.java: //拉取数据观察者接口 public interface PullCustDataObserver { void update(Map<String, Object> map); } 二:写通知者和观察者的具体实现 通知者具体实现 DataNotice.java: /** * @description 拉取数据通知者实现 * @author sgl * @date 2019/12/9 下午 14:11 * @params * @return */ public class DataNotice implements PullCustDataNotice { //用来存放要通知的观察者列表 List

多线程观察者设计模式

倖福魔咒の 提交于 2019-12-25 13:09:13
 假设我们要关心一些事物发生的状态 那么我们可能就需要不断的对这个事物的状态进行查询 而这显然是很低效的 最好的方式应该是当这个事物发生变化时 它会通知我们 而不是我们一味的去查询 这显然会节省大量的时间 这种通知方式就是观察者的设计模式,当某个对象发生状态改变需要通知第三方的时候,观察者模式就特别适合胜任这样的工作 下面我们先看一个比较简单的例子   假设有一个订阅号 每当它发布新文章的时候 它就会通知所有订阅过的用户 用户当收到文章若不喜欢 它可以退订 此后就收不到这个订阅号更新的信息了,这个事件观察者设计模式是很好胜任的,订阅号就相当于是事件源,它有新的推送就相当于状态发生变化,然后就会通知有订阅的观察者,即用户。要实现这个例子,首先显然需要设计一个Observer的集合 它就是承载用户的集合 它就是观察者 当这个订阅号发布文章的时候 就会向这些观察者更新信息   首先先定义一个Observer的接口 里面只有一个方法就是更新 给观察者实现 即给用户实现 public interface Observer { void update(); }   然后定义一个ObserversWay的接口 它是订阅号实现的 订阅号显然是清楚整个事物的状态发生的变化 可以向各个观察者发送更新的信息,用户退订和订阅即为移除观察者和添加观察者 public interface

观察者模式——学生向老师提问

老子叫甜甜 提交于 2019-12-25 04:35:06
一 代码位置 https://gitee.com/cakin24/javatest/tree/master/src/main/java/GPer 二 UML类图 三 测试结果 小明在GPer生态圈上提交了一个问题。 ============================== Tim老师,你好! 您收到一个来自GPer生态圈的提问,希望您解答,问题内容如下 观察者设计模式适用于哪些场景? 提问者:小明 ============================== Tom老师,你好! 您收到一个来自GPer生态圈的提问,希望您解答,问题内容如下 观察者设计模式适用于哪些场景? 提问者:小明 来源: CSDN 作者: cakincqm 链接: https://blog.csdn.net/chengqiuming/article/details/103688823

Java 设计模式归纳(观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态

此生再无相见时 提交于 2019-12-24 07:36:41
DesignPattern 项目地址: youlookwhat/DesignPattern 简介: Java 设计模式归纳 (观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态). 更多: 作者 提 Bug 标签: 参照 Hongyang 的 CSDN 博客所写。如有错误欢迎指正,如有侵权,请联系我删除。 Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式) 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式分为三种类型,共 23 种: 创建型模式 : 单例模式 、抽象工厂模式、建造者模式、 工厂模式 、原型模式。 结构型模式 : 适配器模式 、桥接模式、 装饰模式 、组合模式、 外观模式 、享元模式、代理模式。 行为型模式 : 模版方法模式 、 命令模式 、迭代器模式、 观察者模式 、中介者模式、备忘录模式、解释器模式、 状态模式 、 策略模式 、职责链模式(责任链模式)、访问者模式。 Blog Catalogue: 1. 设计模式 观察者模式(Observer Pattern) 以微信公众服务为例 2. 设计模式 工厂模式(Factory Pattern) 从卖肉夹馍说起 3. 设计模式 单例设计模式(Singleton

组件协作模式之观察者模式(Observer)

天大地大妈咪最大 提交于 2019-12-23 01:43:46
文章目录 一、概念 二、动机 三、源代码讲解 四、使用观察者模式进行改进 五、类图结构 六、要点总结 一、概念    定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新 。——《设计模式》GOF 二、动机    在软件构建过程中,我们需要 为某些对象建立一种“通知依赖关系” ,一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。 如果这样的依赖关系过于紧密,将使得软件不能很好的抵御变化 。    使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系 ,从而实现软件体系结构的松耦合。 三、源代码讲解 class MainForm : public Form { TextBox * txtFilePath ; //文件路径 TextBox * txtFileNumber ; //希望分割的个数 ProgressBar * progressBar ;    //(变化)添加进度条控件,用来显示进度 public : void Button1_Click ( ) { //收集到用户输入的参数信息 string filePath = txtFilePath - > getText ( ) ; int number = atoi ( txtFileNumber - >

案例分析:设计模式与代码的结构特性

北慕城南 提交于 2019-12-22 03:21:05
目录 模式存在的意义 现实生活中的例子 观察者模式的动机 观察者模式的定义与结构 模式的定义 模式的结构 观察者模式的应用实例 问题分析 应用观察者模式的思路 代码实现 GitHub地址 铃声事件类:用于封装事件源及一些与事件相关的参数 抽象观察者类:铃声事件监听器 目标类:事件源,学校的铃 具体观察者类:老师事件监听器 具体观察者类:学生事件监听器 测试类 实例总结 引入该设计模式后对系统架构和代码结构带来了哪些好处 代码实现用到的多态机制 观察者模式总结 模式的适用场景 观察者模式的优缺点 优点 缺点 参考链接 模式存在的意义 现实生活中的例子 在现实世界中,很多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或多个其他对象的行为也发生改变。 例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。像这样的例子还有很多,比如股票价格与股民的联系、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等等。 在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。 所有这些,如果用 观察者模式 来实现就非常方便。 观察者模式的动机 对于上述现实中存在的问题,观察者模式建立起一种对象与对象之间的依赖关系

游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

安稳与你 提交于 2019-12-20 09:03:31
第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模式 (已看) 第7章 状态模式 (已看) 第3篇 序列型模式 第8章 双缓冲 (已看) 第9章 游戏循环 (已看) 第10章 更新方法 (已看) 第4篇 行为型模式 第11章 字节码 (已看) 第12章 子类沙盒 (已看) 第13章 类型对象 (已看) 第5篇 解耦型模式 第14章 组件模式 (已看) 第15章 事件队列 (已看) 第16章 服务定位器 (已看) 第6篇 优化型模式 第17章 数据局部性 (已看) 第18章 脏标记模式 (已看) 第19章 对象池 (已看) 第20章 空间分区 (已看) 第1章 架构,性能和游戏    1.1 什么是软件架构 这本书关于代码的组织方式      1.1.1 什么是好的软件架构 第一个关键部分是,架构意味着变化.衡量一个设计好坏的方法就是看它应对变化的灵活性      1.1.2 你如何做出改变 一旦你理解了问题和它涉及的代码,则实际的编码有时是微不足道的      1.1.3 我们如何从解耦中受益 你可以用一堆方式来定义" 解耦 ",但我认为如果两块代码耦合,意味着你必须同时了解这两块代码.如果你让它们解耦,那么你只需了解其一. 当然