观察者模式

观察者模式(发布订阅模式)的实现方式及应用场景

守給你的承諾、 提交于 2020-03-24 03:43:07
观察者模式(发布订阅模式)的实现方式及应用场景 简述 发布订阅模式的概念:当一个或多个对象依赖于某一个对象,当这个对象的状态发生改变,所有依赖于它的对象都得到状态改变的通知。 一个简单的示例: // 主体 class Subject { constructor() { this.state = 0 this.observers = [] } getState() { return this.state } setState(state) { this.state = state this.notifyAllObservers() } notifyAllObservers() { this.observers.forEach(item => { item.update() }) } attch(observer) { this.observers.push(observer) } } // 观察者 class Observer { constructor(name, subject) { this.name = name this.subject = subject this.subject.attch(this) } update() { console.log(`${this.name} update, state: ${this.subject.getState()}`) }

观察者模式——从JDK到Spring

旧城冷巷雨未停 提交于 2020-03-23 16:23:41
3 月,跳不动了?>>> 文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。 微信公众号,如果一个用户订阅了某个公众号,那么便会收到公众号发来的消息,那么,公众号就是『被观察者』,而用户就是『观察者』 气象站可以将每天预测到的温度、湿度、气压等以公告的形式发布给各种第三方网站,如果天气数据有更新,要能够实时的通知给第三方,这里的气象局就是『被观察者』,第三方网站就是『观察者』 MVC 模式中的模型与视图的关系也属于观察与被观察 观察者模式是使用频率较高的设计模式之一。 观察者模式包含观察目标和观察者两类对象,一个目标可以有任意数目的与之相依赖的观察者,一旦观察目标的状态发生改变,所有的观察者都将得到通知。 定义 观察者模式(Observer Pattern) : 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 观察者模式是一种 对象行为型模式 。 观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 细究的话,发布订阅和观察者有些不同

观察者模式和发布订阅模式(下)

不想你离开。 提交于 2020-03-21 19:47:12
发布订阅模式 前一篇对观察者模式做了介绍,重点在于观察者和被观察者的对应关系,以及将被观察者的改变及时通知到相对应的观察者。 这样的模式基本上可以解决少量数据源的情景,在观察者和被观察者可能是多对多关系的情况下,强耦合的结构会让代码不够清晰,难以维护。 在《JavaScript设计模式》一书中,提到了Observer和Publish/Subscribe的区别。 Observer模式要求希望接收到主题同志的观察者(或对象)必须订阅内容改变的事件。 Publish/Subscribe模式使用了一个主题/事件通道,这个通道介于希望接收到通知(订阅者)的对象和激活事件的对象(发布者)之间。该事件系统允许代码定义应用程序的特定事件,这些事件可以传递自定义参数,自定义参数包含订阅者所需的值。其目的是避免订阅者和发布者之间产生依赖关系。 这里的关键点在于,通过一个事件中心,将发布者和订阅者的耦合关系解开,发布者和订阅者通过事件中心来产生联系。 打个比方,发布者像是发布小广告的,事件中心是一个调度站,订阅者则告诉事件中心,我关注A、B类型的广告,如果有更新,请通知我。调度站记录A,B类型下的订阅者,等到A,B广告发布时,通知到订阅者。 这个例子里,发布者不关心订阅者是谁,也不维护订阅者列表,同订阅者解耦,只将自己发布的内容提交到事件中心。而订阅者和主题的关系,交给了事件中心来维护。

订阅发布者模式的简单实现

狂风中的少年 提交于 2020-03-21 19:42:02
什么是订阅发布者模式?    一个对象作为特定任务或是另一对象的活动的观察者,并且在这个任务或活动发生时,通知观察者。观察者也被叫作订阅者(Subscriber),它指向被观察的对象,既被观察者(Publisher 或 subject)。当事件发生时,被观察者(Publisher)就会通知观察者(subscriber)。 举个例子:我们订阅微信公众号之后,当公众号有新动作的时候,他就会推送文章给我们,我们作为订阅者就知道了公众号(发布者)有新的动作。 下面是代码的简单实现: var observer = { callbacks: [], //订阅列表 add: function (fn) { //添加新的订阅 this.callbacks.push(fn); }, fire: function () { //发推送给所有订阅者 this.callbacks.forEach(function (fn) { fn(); }) } } observer.add(function () { console.log("我是第一个粉丝,我订阅了你的公众号"); }); observer.add(function () { console.log("我是第二个粉丝,我订阅了你的公众号"); }) observer.fire(); //公众号发新文章,每个订阅者收到通知并且执行相应的操作

设计模式——观察者模式

不羁的心 提交于 2020-03-18 13:35:41
概念 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 观察者模式结构图 该模式包含四个角色: 抽象被观察者角色 :也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 抽象观察者角色 :为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 具体被观察者角色 :也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。 具体观察者角色 :实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。 代码示例 下面用一个微信公众号发布文章的列子来简单讲解下观察者模式。通过这个列子,能帮助我们加深对观察者模式的理解。 step1:定义Subject和Observer接口 //定义一个微信公众号接口,相当于类图中的Subject角色 public interface WeChatOfficialAccount { public void registerObserver(WeChatObserver observer); public

事件(_观察者模式)

自古美人都是妖i 提交于 2020-03-16 21:35:31
一个类如果声明一个Public的委托让其他方法注册,同样也会存在外部直接调用此委托,这样是有会出现莫名的调用风险的。因此就有了事件,事件无法在外部直接调用。外部只有注册(定阅)。内部进行发布。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 事件_观察者模式_ { class Program { static void Main(string[] args) { CAT cat = new CAT("TOM","黄色"); Mouse mouse1 = new Mouse("米奇1", "黑1色",cat); Mouse mouse2 = new Mouse("米奇2", "黑2色", cat); Mouse mouse3 = new Mouse("米奇3", "黑3色", cat); cat.CatComing(); // cat.CatCome();这如果不是一个事件,是可以在外面调用的,是事件则不能调用。 Console.ReadKey(); } } } class CAT { public string name; public string color; public

观察者模式

拟墨画扇 提交于 2020-03-16 09:47:41
//被观察者 function Observed () { this.state = '不开心'; this.arr = []; } //将Observer注册到Observed上 Observed.prototype.attach = function (s) { this.arr.push(s); } //产生新状态 Observed.prototype.setState = function (newState) { this.state = newState; this.arr.forEach(fn=>fn.update(this.state)) } //观察者 function Observer (name,target) { this.name = name; this.target = target; } //提供一个更新方法,当被观察者的数据发生变化时,需要执行观察者的 update 方法 Observer.prototype.update = function (newState) { console.log(this.name+'监控到了宝宝的'+newState) } let o = new Observed(); let s1 = new Observer('s1',o); let s2 = new Observer('s2',o); o.attach(s1

观察者模式(1)

时光怂恿深爱的人放手 提交于 2020-03-13 12:39:09
  (1)笔试中有一个自定义事件的题,这个题其实考的就是观察者模式。   (2)Js中实现双向数据绑定也可以用观察者模式。所谓双向数据绑定指的是:数据的操作可以实时反映到数据,数据的变更也可以实时的展现在页面。(如AngularJs)   观察者模式是一种设计模式,又叫发布订阅模式(Publish/Subscribe)。它定义了对象间一对多的关系,让多个观察者对象同时监听某个主体对象,当这个对象的状态发生变化时,所有监听这个对象的观察者都会收到一个通知,从而自动更新自己的状态。 例子:   假如我们正在开发一个商城网站,网站里有header头部、nav导航、消息列表、购物车等模块。这几个模块的渲染有一个共同的前提条件,就是必须先用ajax异步请求获取用户的登录信息。这是很正常的,比如用户的名字和头像要显示在header模块里,而这两个字段都来自用户登录后返回的信息。这个时候,我们就可以把这几个模块的渲染事件都放到一个数组里面,然后待登录成功之后再遍历这个数组并且调用每一个方法。   一个PubSub模型主要有三个方法:订阅(subscribe),退订(unsubscribe),发布(publish)。   我们先来实现一个简单的PubSub模块。 var PubSub={}; //用于存储事件队列,事件管理器 var quene={}; //其中event为事件名称

VTK_Learning_交互与Widget_观察者/命令模式

▼魔方 西西 提交于 2020-03-11 12:50:23
1.前言 一个强大的可视化系统不仅需要强大的数据处理能力,也需要方便易用的交互功能。图形处理软件ParaView(hhttp://www.paraview.org)、德国癌症研究中心研发的MITK(http://www.mitk.org)等开源软件系统都提供了强大的交互功能,作为ParaView、MITK等软件构件基础的VTK同样也提供了各种各样的交互功能。 VTK的交互除了可以监听来自鼠标、键盘等外部设备的消息,还可以在渲染场景中生成功能各异的交互部件(Widget),用于控制可视化过程的参数,达到用户的渲染要求。 2.观察者/命令模式(Observe/Command) 观察者/命令模式是VTK里用的比较多的设计模式。 VTK中绝大多数的类都派生自vtkObject。查看类vtkObject的接口可以找到AddObserve()、RemoveObserve()、GetCommand()等函数。 观察者/命令模式是指一个Object可以有多个Observe,他定义了对象间的一种“一对多”的依赖关系, 当一个Object对象的状态发生改变时,所有依赖于它的Observe对象都得到通知而被自动更新。命令模式属于对象行为模式,他将一个请求封装为一个对象,并提供一致性发送请求的接口,当一个事件发生时,他不直接把事件传递给事件调用者,而是在命令和调用者之间增加一个中间者,讲这种直接关系切断

[设计模式]观察者模式

送分小仙女□ 提交于 2020-03-09 13:11:20
一、观察者模式的定义与特点 1 、定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新 注:简单地说,主题 + 观察者 = 观察者模式 或者 出版者 + 订阅者 = 观察者模式 2 、优点: 松耦合设计,降低了对象之间的依赖; 目标与观察者之间建立了一套触发机制。 3 、缺点: 虽然是松耦合设计,但是并没有完全解除目标与观察者之间的依赖关系,导致有可能出现循环引用,系统崩溃; 当观察者很多时,通知会花费很多时间,影响程序的效率。 二、观察者模式的设计原则 1 、主题与观察者之间的松耦合设计。所谓松耦合,即对象之间的互相依赖降到了最低,对象之间可以交互,但是不太清楚彼此的细节。 注:有多个观察者时,不可以依赖特定的通知次序 三、模式的结构 1 、抽象主题:它提供了一个用于保存观察者对象的句积累和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 2 、具体主题:它实现抽象主题中的通知方法,当具体主题的内部状态发生改变时,通知所有注册股的观察者对象。 3 、抽象观察者:它是一个抽象类或者接口,包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。 4 、具体观察者:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自己的状态。 四、模式的应用场景 1 、对象之间存在一对多关系