观察者模式

设计模式——观察者模式:气象监测应用

亡梦爱人 提交于 2020-04-14 14:27:05
【推荐阅读】微服务还能火多久?>>> 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。(来自Head First设计模式) 定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新(来自百度百科) 观察者模式类图 观察者模式组成 抽象对象角色: 把所有观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意个观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。(图中Subject) 抽象观察者角色: 为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。(图中Observer) 具体主题角色: 在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。(图中ConcreteSubject) 具体观察者角色: 该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态想协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。(图中ConcreteObserver) 观察者模式使用场景 ###1. 场景需求 建立一个天气实时更新的应用,有三种布告板,分别显示目前的状况、天气统计及简单的预报。当天气数据发生变化时,三种布告板必须实时更新。 ###2. 应用概况

《 Head First 》学习笔记:观察者模式 (python实现)

情到浓时终转凉″ 提交于 2020-04-11 21:15:21
病殃殃的还是来记录一下学习笔记,不然的话过几天可能就忘了,白学了。 observer mode 在java 用得很多,咱也试一下用python来实现,由于python没有接口,就只能继承一个类来用用了。 先撸一下代码: ubuntu@yee:/tmp/observer$ vim subject.py #!/usr/bin/python #-*- coding:utf8 -*- class Subject(object): //主题发布中心 def registerObserver(self,observer): //注册观察者 pass def removeObserver(self,observer): //删除观察者 pass def notifyObservers(self): //通知中心 pass class Observer(object): //观察者 def update(self,temp,humidity,pressure): pass class DisplayElement(object): //所有的观察都是继承于它,=。= def display(self): pass ubuntu@yee:/tmp/observer$ vim display.py //这是布告板 #!/usr/bin/python #-*- coding:utf8 -*- from

觀察者模式

萝らか妹 提交于 2020-04-08 13:10:01
觀察者模式實際上就是發布訂閱模式.即可以進行推操作與拉操作.比如SQL Server或IBM MQ Sphere的發布訂閱方式. 對於推操作,就是對於訂閱者,由系統一些性推給訂閱者.一般是不分好壞,全都發. 對於基礎數據的發布操作使用這個操作是相當好的. 對於拉操作,就是被訂閱者通過一個接口,把訂閱的資料上在上面,而由訂閱者自行拉到. 例子1: 下面事例使用推操作方式操作得到. // “观察者”接口 public interface IObserver { void Notify( object anObject); } // “被观察对象”接口 public interface IObservable { void Register(IObserver anObserver); void UnRegister(IObserver anObserver); } // 所有被观察对象的基类 public class ObservableImpl : IObservable { // 保存观察对象的容器 protected Hashtable _observerContainer = new Hashtable(); // 注册观察者 public void Register(IObserver anObserver) { _observerContainer.Add

设计模式-观察者模式JAVA实现

一曲冷凌霜 提交于 2020-04-05 17:23:30
观察者模式 粗浅地说就是做了两件事 1,当当前被关注的事件发生时它的观注者会被通知到 2,避免通知动作与关注者的硬性绑定,要进行解耦 这是观察者模式的本质思路,不应被其他过多的硬性的准确的描述所干扰。 还是以具体的业务做为切入点来理解观察者模式 在拣货完成要进行出库时,会简略做以下几个动作比如 1,修改出库单据的状态 2,通知服务(ERP)系统,仓储要出库了 3,通知客户(实际上要调用比如短信接口等)拣货出库了 3,通知WMS(仓储系统)要出库扣减库存了 从以上看出,除了要修改单据外。有三个业务要被通知到,那么我就可以对这三个业务进行抽象,使其成为观察者。 那么先设计顶层的接口 package observer; import bean.PickDoc; /** 通知的实现接口 @author zhousjmas@hotmail.com */ public interface IStockOutNotify { //通知修改 public void nodify(PickDoc pickDoc); } 这里就抽象出一个共同的接口,nodify方法,告诉这些系统哪个单据出库了。由这些系统自己去查找对应的客户与库存,进行记账,扣减库存,通知客户的操作。 然后抽出三个业务观注者 package observer; import bean.PickDoc; /** 通知服务已拣货出库

大话设计模式之观察者模式

☆樱花仙子☆ 提交于 2020-04-04 09:46:56
1:类图的实现 2:观察者模式的分析   针对,上面的类图我们详细讲解一下观察者模式的概念:观察者模式是一种一对多的依赖关系,让多个观察者对象能够监听同一个对象,只要该对象发生变化后,所有观察者都可以知道,使观察者能够更新自己的状态。   Subject类:该类型为通知者,把所有观察者都装进自己的内部的容器里,这个容器可以有一定数量的观察者,允许一定的删除和添加,该通知者发生变化时,Subject类型中有notifly方法来同时观察者。   Observer类:该类为观察者,即每一个需要被通知者通知的对象都要实现该方法,同时实现接口里的Update方法,供Subject通知类使用来通知观察者。 3:代码实现 package observerPattern; /** * @author :dazhu * @date :Created in 2020/4/4 7:49 * @description: * @modified By: * @version: $ */ public class Main { public static void main(String[]args){ Observer o1 = new Observer1("张三"); Observer o2 = new Observer2("李四"); Observer o3 = new Observer2("王二");

设计模式之观察者模式(Observer)详解及代码示例

独自空忆成欢 提交于 2020-04-01 03:51:59
一、模式的定义与特点   观察者(Observer)模式的定义:观察者模式又被称为发布-订阅/模型-视图模式,属于 行为型 设计模式的一种,是一个在项目中经常使用的模式。指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 二、观察者模式优缺点   观察者模式是一种对象行为型模式,其主要优点如下: 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 目标与观察者之间建立了一套触发机制。   它的主要缺点如下: 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。 三、观察者模式的实现   实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。   观察者模式的主要角色如下。 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法

IOS消息机制-NSNotification与NSNotificationCenter

自作多情 提交于 2020-03-30 03:08:51
  IOS的消息机制其实是观察者模式的一个实践。你对某个事件感兴趣,那就就去注册成为他的观察者,这样当这个事件发生时就会收到人家的通知啦,就这么简单。还记得我们在《IOS之MVC》中说过,model不能直接调用controller,但是可以通过某种特殊的手段,间接的告诉controller去干什么,从而达到调用的目的。通过发送消息可以达到代码的彻底解耦。   消息机制的主要流程是:      与notification相关的类及方法使用: NSNotification   NSNotification封装了一些信息是的通过NSNotificationCenter发送消息的时候可以携带一些额外的信息。一个NSNotification对象包括一个name,object和一个额外的dictionary。name是用来标识一个消息的tag,object是消息的发送者想告诉消息接受者的一个对象(通常是消息的发送者),而dic存储了一些消息相关的信息。NSNotification是不可变的对象。   你可以通过下面的这些方法创建一个NSNotification对象:    + notificationWithName:object:   + notificationWithName:object:userInfo:    – initWithName:object:userInfo:   -

Vue2.0源码阅读笔记(二):响应式原理

夙愿已清 提交于 2020-03-27 11:45:22
  Vue是数据驱动的框架,在修改数据时,视图会进行更新。数据响应式系统使得状态管理变的简单直接,在开发过程中减少与DOM元素的接触。而深入学习其中的原理十分有必要,能够回避一些常见的问题,使开发变的更为高效。 一、实现简单的数据响应式系统   Vue使用 观察者模式 (又称 发布-订阅模式 )加 数据劫持 的方式实现数据响应式系统,劫持数据时使用 Object.defineProperty 方法将 数据属性 变成 访问器属性 。Object.defineProperty 是 ES5 中一个无法 shim 的特性,因此Vue 不支持 IE8 以及更低版本浏览器。   Vue源码中对数据响应式系统的实现比较复杂,在深入学习这部分源码之前,先实现一个较为简单的版本更有助于后续的理解。代码如下所示: let uid = 0 // 容器构造函数 function Dep() { // 收集观察者的容器 this.subs = [] this.id = uid++ } Dep.prototype = { // 将当前观察者收集到容器中 addSub: function(sub) { this.subs.push(sub) }, // 收集依赖,调用观察者的addDep方法 depend: function() { if(Dep.target){ Dep.target.addDep(this)

观察者模式经典例子(猫叫)

拟墨画扇 提交于 2020-03-27 08:43:21
最近在园子里浏览时看到不少朋友都在提一道经典的C#面试题: "猫叫,老鼠跑,主人被惊醒",要求用C#实现. 园子里已经有不少的朋友都实现了.具体的方法通过观察者模式或者事件来实现. 我这里先摘录一下观察者模式的实现,代码如下: 1 namespace 猫叫 2 { 3 // 猫叫,老鼠跑,主人惊醒 4 // 使用观察者模式 5 // step1 抽象观察者 6 public interface Observer 7 { 8 void Response(); // 接收到事件后作出反应 9 } 10 // step2 抽象引发观察者反应的主对象(猫) 11 public interface Subject 12 { 13 void AimAt(Observer ob); // 猫叫后将作用的对象 14 } 15 // 抽象老鼠和主人 16 public class Mouse:Observer 17 { 18 private string name; 19 public Mouse( string name,Subject sub) // 在构造函数中添加对Subject对象的观察(这里观察猫) 20 { 21 this .name = name; 22 sub.AimAt( this ); 23 } 24 public void Response() 25 { 26 Console

观察者模式之spring事件机制

混江龙づ霸主 提交于 2020-03-24 07:34:16
ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者、被观察者。2.被观察者做出相应得动作,观察者能接收到。不分析设计模式,学习下spring中的事件机制实际开发如何使用 及使用场景 。 spring中的事件机制涉及到者几个类文件 :ApplicationEvent(事件类型)、ApplicationListener(事件监听类)、ApplicationEventPublisher(事件发布类)。先看看这几个类的继承、实现关系: Application类继承jdk Utill包中的 EventObject,下面实现了很多子类: ApplicationListener :接口继承了utill 包中的EventListener接口,泛型参数E必须继承ApplicationEvent类 ApplicationEventPublisher: 事件发布接口 ,实现类很多,其中子类ApplicationContext,发布事件就用ApplicationContext类去发布 使用方法:   1.声明事件类型 public class DemoEvent extends ApplicationEvent{ private static final long serialVersionUID = 1L; public DemoEvent(Object