观察者模式

设计模式之观察者模式

跟風遠走 提交于 2019-11-30 15:50:34
一、简介 观察者模式(发布/订阅模式) ,定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 有很多项目都用到了该设计模式,比如 Spring的事件机制 、消息队列等。 Java提供了两个接口 java.util.Observable 和 java.util.Observer ,也可以利用这两个接口实现。 类图如下: 观察者模式类图 二、示例 需求背景是气象站发布天气数据,所有订阅了气象站的布告板显示天气数据。 先上类图: enter description here 主题接口 /** * 主题接口 * Created by 2YSP on 2018/1/24. */ public interface Subject { /** * 注册一个观察者 * @param observer */ void registerObserver(Observer observer); /** * 移除一个观察者 * @param observer */ void removeObserver(Observer observer); /** * 通知所有观察者 */ void notifyObservers(); } 观察者接口 public interface Observer { /** * 所有观察者必须实现该方法, * 当气象观测值改变时

JS-观察者模式

你。 提交于 2019-11-30 13:20:59
如果说,你只能掌握一种设计模式,那必须毫不犹豫的选择观察者模式,也叫发布订阅模式。 es6中promise的实现、vue中双向绑定原理的实现、Node.js中的 EventEmitter事件监听器等等都应用到了观察者模式,可见其应用之广泛 那接下来具体看一下观察者模式到底是什么 介绍 一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。 来个通俗一点的解释吧。小明最近在找工作,好不容易约到一家心仪的公司A面试,结果到了以后发现职位不匹配。但是小明不甘心,就告诉HR什么时候有匹配的岗位就告诉我,天荒地老我都等,HR说那也行,你关注一下我们公司的公众号,有消息我就发在那个上了。同时又有小红、小李都来面试,情况也和小明一样。HR心想随便你们多少人,我到时候在公众号上发一下消息就行了,到时候你们爱来不来。那当然了小明也不管你HR到底是谁,只要你有岗位发消息告诉我就行。 在上述栗子中,HR就是发布者,求职者就是订阅者 优点 对象之间解耦,发布者只管发布一条消息出去,它不关心这条消息如何被订阅者使用,同时,订阅者只监听发布者的事件名,只要发布者的事件名不变,它不管发布者如何改变 缺点 1.创建订阅者本身会消耗一定时间和内存。当订阅一个消息后,也许此消息最后都未发生,但这个订阅者会始终存在于内存中 2.多个发布者和订阅者嵌套一起的时候

设计模式--观察者模式

心不动则不痛 提交于 2019-11-30 10:51:10
public class Test {   //被观察者对象 public static void main(String[] args) { TreeData treeData = new TreeData(); treeData.setName("数据1"); treeData.setNum(3); TreeObserver treeObserver = new TreeObserver(); treeData.addObserver(treeObserver); treeData.setNum(6); }   //观察者 static class TreeData extends Observable{ private int num = 0; private String name = ""; public String getName( ) { return name; } public void setName(String name) { this.name = name; } public int getNum( ) { return num; } public void setNum(int num) { this.num = num; setChanged(); notifyObservers(this); } } static class

观察者模式

耗尽温柔 提交于 2019-11-30 05:59:02
观察者模式允许多个观察者订阅一个主题,当主题的状态发生变化时,能够将这种变化通知到每个观察者。从主题的角度看,这是典型的一对多关系,即一个主题可以对应多个观察者。以订阅邮件为例,当订阅某一类主题内容(例如娱乐新闻,动漫等)时,如果该主题的内容有更新,那么每一个订阅该主题的人都会受到一封内容更新的邮件,这便是典型的观察者模式。 要实现邮件订阅的功能,需要先定义一个主题接口,主题接口需要能够随时添加或者删除订阅人(观察者),并且在有内容更新时通知观察者,其定义如下: 1 public interface Subject { 2 //添加观察者 3 void registerObserver(Observer observer); 4 5 //移除观察者 6 void removeObserver(Observer observer); 7 8 //有新内容时通知观察者 9 void notifyObserver(); 10 } 与主题接口对应的是观察者接口,接口很简单,在有内容的时候更新状态: 1 public interface Observer{ 2 void update(); //更新状态 3 } 主题接口有许多实现,这里选择娱乐新闻主题作为例子: 1 import java.util.ArrayList; 2 import java.util.List; 3 4 public

004-行为型-03-观察者模式(Observer)

╄→гoц情女王★ 提交于 2019-11-30 02:04:20
一、概述   当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。   定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。   Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。 1.1、适用场景   一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。   关联行为场景,建立一套触发机制 典型应用   1、侦听事件驱动程序设计中的外部事件   2、侦听/监视某个对象的状态变化   3、发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者 1.2、优缺点 优点: 观察者和被观察者之间建立一个抽象的耦合 观察者模式支持广播通信,建立一套触发机制。 缺点: 观察者之间有过多的细节依赖、提高时间消耗及程序复杂度 使用要得当,要避免循环调用 1.3、类图角色及其职责      1、Subject(被观察者)   被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。    2

观察者模式

走远了吗. 提交于 2019-11-30 01:18:59
观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 如何解决: 使用面向对象技术,可以将这种依赖关系弱化。 关键代码: 在抽象类里有一个 ArrayList 存放观察者们。 应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 使用场景:

设计模式之观察者模式

烈酒焚心 提交于 2019-11-29 17:26:20
今天让我们来学习一下观察者模式 一、认识观察者模式:   我们都知道报社和杂志订阅的关系,报社的业务就是出版报纸,当你向报社订阅报纸后,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,就会一直收到新的报纸。当你不想再看报纸的时候,取消订阅,他们就不会再送新报 纸来。 只要报社还在运营,就会一直有人(或单位)向他们订阅报纸或取消订阅报纸。    如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。    下面通道一张图来更好的了解观察者模式: 二、定义    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。    (主题和观察者定义了一对多的关系。观察者依赖于此主题,只要主题状态一有变化,观察者就会被通知。根据通知的风格,观察者可能因此新值而更新。) 三、理解并实现观察者模式   1、我们先来看一下观察者模式的UML类图:   2、 观察者模式提供了一种对象设计,让主题和观察者之间松耦合。从而让对象之间的互相依赖降到了最低。(这也是面向对象设计的一条非常重要的原则)   3、下面我们通过气象站的例子来实现观察者模式     (1)、此气象站的功能是当气象数据变化的时候

【Android JetPack系列】LiveData

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-29 13:09:30
一、前言 1、什么是 LiveData LiveData 是一个数据持有类。它具有以下特点: 数据可以被 观察者 订阅; 能够感知组件( Fragment、Activity、Service ) 的生命周期; 只有在 组件 处于 激活状态才会通知观察者有数据更新; 2、LiveData 能为我们做什么 能够保证 数据 和 UI 统一 。 LiveData 采用了 观察者模式, LiveData 是被观察者,当数据有变化时会通知 UI 。 减少内存泄露 。 LiveData 能够感知到组件的生命周期,当组件处于 销毁( destroyed ) 状态时,观察者对象会被清除,当 Activity 停止时不会导致 crash ,因为 组件处于非激活状态时,不会收到 LiveData 中数据变化的通知。 组件和数据相关的内容能够实时更新 。组件在前台的时候能够实时收到数据改变的通知,当组件从后台切换到前台时, LiveData 能够将最新的数据通知组件,因此保证了组件中和数据相关的内容能够实时更新。 解决横竖屏切换( configuration change )数据问题 。在屏幕发生旋转时,不需要额外的处理来保存数据,当屏幕方向变化时,组件会被 recreate ,然而系统并不能保证你的数据能够被恢复。当采用 LiveData 保存数据时,因为数据和组件分离了,当组件被 recreate

观察者模式

六月ゝ 毕业季﹏ 提交于 2019-11-29 05:08:29
第一、观察者模式定义 观察者模式(ObServer Pattern)定义对象之间的一对多的依赖,让多个观察者对象同时监听一个对象,当主体对象发生变化时,它的所有依赖者(观察者) 都会收到通知并更新,其实就是发布定义模式,发布者发布消息,订阅者获取消息,订阅了就能接收到消息,没有订阅就接收不到消息。 第二、观察者模式应用场景 Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册分布式配置中心 第三、观察者模式原理类图 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口, 可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态 第四、观察者模式简单实现 /** * 抽象主题 */ public interface AbstractSubject { /** * 添加ObServer 添加订阅者 * @param obServer */ public void addObServer(ObServer obServer); /** *

观察者模式(发布、订阅)之(上)

这一生的挚爱 提交于 2019-11-29 03:11:37
什么是观察者模式? 摘自百度百科的说法:观察者模式(有时又被称为发布( publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是 软件设计模式 的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 说白了,就是一个主题,可以有N多个观察者,一个观察者,也可以订阅N多个主题。当一个主题,发生改变时,会通知订阅它的观察者,观察者收到通知后,可以做相应的处理。观察者模式,是软件设计模式中的一种。接下里,我们介绍下,使用C#实现的观察者模式。附上代码。 首先,我们新建一个名为AppObserver的控制台项目。结构如下: Strategy目录下新建两个接口,一个IObserver(观察者)、一个ISubject(主题)。让我们看看,这两个接口分别定义了什么? /* * Created by http://www.lichaoqiang.com * User: 李朝强 * Date: 2016/9/2 * Time: 16:25 * * To change this template use Tools | Options | Coding | Edit Standard Headers. *