观察者模式

设计模式之行为类模式大PK

夙愿已清 提交于 2019-11-27 00:36:31
行为类模式大PK 行为类模式包括 责任链模式 、 命令模式 、解释器模式、迭代器模式、 中介者模式 、 备忘录模式 、 观察者模式 、 状态模式 、 策略模式 、 模板方法模式 、 访问者模式 。该组设计模式众多,如下我们着重介绍一下命令模式VS策略模式、状态模式VS策略模式、观察者模式VS责任链模式。 命令模式VS策略模式 命令模式和策略模式类图很相似,只是命令模式多了一个接收者(Receiver)角色,通过确切的Command类调用Receiver类,实现了调用者和具体的接收者的解耦。策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务,通过对算法的封装实现算法的独立,并且可以相互转换,让行为的变化独立于拥有行为的客户,如我们在策略模式中的例子:诸葛亮给赵云的锦囊妙计,其中每个计策就是一个算法,对妙计进行封装,在不同的时间调用执行不同的计策;而命令模式是对动作解耦,把一个动作的执行分为执行对象(Receiver)和执行行为(Command),让两者相互独立而不相互影响,我们在命令模式中举出了软件开发的例子,软件开发中包括美工组、界面组、编码组,这就是各个执行对象,还包括一个产品经理,就是那个执行行为,客户通过只跟Command打交道实现各个执行对象的行为。   接下来我们从对文件压缩的业务需求出发,分别按照命令模式和策略模式设计出一套实现

深入理解Spring的容器内事件发布监听机制

删除回忆录丶 提交于 2019-11-26 22:47:53
目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监听 4.Spring事件监听源码解析 4.1 初始化事件发布器流程 4.2 注册事件监听器流程 4.3 容器事件发布流程 5.总结 1. 什么是事件监听机制 在讲解事件监听机制前,我们先回顾下设计模式中的观察者模式,因为事件监听机制可以说是在典型观察者模式基础上的进一步抽象和改进。我们可以在JDK或者各种开源框架比如Spring中看到它的身影,从这个意义上说,事件监听机制也可以看做一种对传统观察者模式的具体实现,不同的框架对其实现方式会有些许差别。 典型的观察者模式将有依赖关系的对象抽象为了观察者和主题两个不同的角色,多个观察者同时观察一个主题,两者只通过抽象接口保持松耦合状态,这样双方可以相对独立的进行扩展和变化:比如可以很方便的增删观察者,修改观察者中的更新逻辑而不用修改主题中的代码。但是这种解耦进行的并不彻底,这具体体现在以下几个方面: 1.抽象主题需要依赖抽象观察者,而这种依赖关系完全可以去除。 2.主题需要维护观察者列表,并对外提供动态增删观察者的接口, 3.主题状态改变时需要由自己去通知观察者进行更新。 我们可以把主题(Subject)替换成事件(event)

16.观察者模式

ぐ巨炮叔叔 提交于 2019-11-26 22:15:17
观察者模式 一、应用实例 1)气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。 2)需要设计开放型API,便于其他第三方也能接入气象站获取数据。 3)提供温度、气压和湿度的接口 4)测量数据更新时,要能实时的通知给第三方 二、观察者模式 1.基本介绍 对象之间多对一依赖的一种设计,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。 2.类图说明 3.代码实现 public class Client { public static void main(String[] args) { //创建一个WeatherData WeatherData weatherData = new WeatherData(); //创建观察者 CurrentConditions currentConditions = new CurrentConditions(); BaiduSite baiduSite = new BaiduSite(); //注册到weatherData weatherData.registerObserver(currentConditions); weatherData.registerObserver(baiduSite); //测试 System.out.println(

观察者模式(Observer Pattern)

依然范特西╮ 提交于 2019-11-26 20:31:09
观察者模式(Observer Pattern) —— 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 观察者模式可以理解为发布-订阅模式,即多个订阅者(观察者)向发布者(被观察者)订阅状态信息,当发布者更新状态时会将状态信息向它的订阅者发布信息。发布者需要自己维护订阅者列表,可以注册或者注销对状态信息感兴趣或不感兴趣的订阅者。 // subject.h #include<vector> #include<string> using namespace std; typedef int State; class Observer; // 被观察者(发布者)抽象 class Subject { public: Subject(){} virtual ~Subject(){} virtual void Attach(Observer* obv); // 注册观察者 virtual void Detach(Observer* obv); // 注销观察者 virtual void Notify(); // 通知观察者 virtual void SetState(const State& st) = 0; virtual State GetState() = 0; private: //观察者列表 vector<Observer*>

设计模式——观察者模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-26 17:55:14
观察者模式 定义 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。 类图 例子 假设由这样一个例子,大家都比较关注房价,所以关注了一个网站,利用rss订阅。当有新的动态更新时,所有订阅的用户就会收到最新的消息。 定义主题及其实现House Site package com.gitlearning.hanldegit.patterns.observe.first; import java.util.ArrayList; import java.util.List; /** * 房子站点 */ public class HouseSite implements Subject{ private List<Subscriber> observers; public HouseSite() { observers = new ArrayList<>(); } @Override public void registerObserver(Subscriber subscriber) { observers.add(subscriber); } @Override public void removeObserver(Subscriber subscriber) { observers.remove(subscriber); }

观察者模式

让人想犯罪 __ 提交于 2019-11-26 16:13:51
定义 定义对象间的一对多的关系,使得每当一个对象的状态改变,则所有依赖与它的对象都会得到通知并被自动更新 使用场景 观察者和被观察者是抽象耦合,利于扩展 一个对象的改变将会导致一个或多个对象的改变,不清楚具体有多少对象以及这些被影响的对象是谁的情况 如果有这样一个影响链的情况下也可以使用,例如A的改变会影响B,B的改变会影响C......,可以使用观察者模式设计一个链式触发机制。 实现方式 被观察者,商品类 import java.math.BigDecimal; import java.util.Observable; public class Product extends Observable { protected String name; protected BigDecimal price; public Product(String name, BigDecimal price) { super(); this.name = name; this.price = price; } public String getName() { return name; } public BigDecimal getPrice() { return price; } /** * 商品名称变更 * @param name 商品名称 */ public void setName

设计模式之观察者模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-26 13:57:17
定义:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,将自动更新。 首先看书上的一个需求,建立一个气象观测站应用。利用weatherData对象取得数据,并更新三个布告板。 首先看个观察者模式的类图 public interface Subject{ public void registerObserver(Observer o);//该观察者用来注册或者删除 public void removeObserver(Observer o); public void notifyObservers();//当主题状态改变时,通知所有观察者 } public interface Observer{ public void update(float temp,float humdity,float pressure); //当气象观测站的值改变时,主题会把这些状态值当做方法的参数给观察者 } public interface DisplayElement{ public void display();//布告板展示时调用此方法 } //这是一个具体的主题 public class WetherDate implements Subject{ private ArrayList Observers; private float temperature;/

iOS开发---图解KVO

你说的曾经没有我的故事 提交于 2019-11-26 12:44:54
文章目录 iOS开发---图解KVO 什么是KVO? KVO基本使用 注册观察者 监听回调 调用方式 自动调用 手动调用 移除观察者 Crash 观察者未实现监听方法 未及时移除观察者 多次移除观察者 实际应用 KVO实现原理 测试代码 发现中间对象 NSKVONotifying_Person类内部实现 setter实现不同 KVO内部调用流程 KVO扩展 1.KVC 与 KVO 的不同? 2.和 notification(通知)的区别? Table of Contents iOS开发—图解KVO 什么是KVO? KVO基本使用 注册观察者 监听回调 调用方式 自动调用 手动调用 移除观察者 Crash 观察者未实现监听方法 未及时移除观察者 多次移除观察者 实际应用 KVO实现原理 测试代码 发现中间对象 NSKVONotifying_Person类内部实现 setter实现不同 KVO内部调用流程 KVO扩展 1.KVC 与 KVO 的不同? 2.和 notification(通知)的区别? iOS开发—图解KVO 什么是KVO? KVO 全称 Key Value Observing ,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于 KVO 的实现机制,只针对属性才会发生作用,一般继承自 NSObject 的对象都默认支持 KVO

Tomcat 系统架构与设计模式_ 设计模式分析

偶尔善良 提交于 2019-11-26 12:12:18
门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到了这种设计模式。 门面设计模式的原理 这么多场合都用到了这种设计模式,那这种设计模式究竟能有什么作用呢?顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。 这种设计模式主要用在一个大的系统中有多个子系统组成时,这多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。 门面设计模式示意图如下: 图 1. 门面示意图 Client 只能访问到 Façade 中提供的数据是门面设计模式的关键,至于 Client 如何访问 Façade 和 Subsystem 如何提供 Façade 门面设计模式并没有规定死。 Tomcat 的门面设计模式示例 Tomcat 中门面设计模式使用的很多,因为 Tomcat 中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。 下面是 Request

观察者模式

给你一囗甜甜゛ 提交于 2019-11-26 10:59:50
//被观察者 class Subject { constructor(name) { this.name = name; this.observers = []; this.status = 'happy'; } //被观察者提供一个方法 接受观察者 attach(observer) { this.observers.push(observer); } setStatus(newStatus) { this.status = newStatus; this.observers.forEach(o=>o.update(newStatus)); } } //观察者 class Observer { constructor(name){ this.name = name; } update(newStatus){ // 用来通知所有的观察者状态更新了 console.log(this.name+'说:孩子'+newStatus); } } let sub = new Subject('孩子'); let o1 =new Observer('父亲'); let o2 =new Observer('母亲'); let o3 =new Observer('爷爷'); let o4 =new Observer('奶奶'); sub.attach(o1); sub.attach(o2); sub