观察者模式:定议

定义对象间的一种一对多的关系,当一个对象状态改变时 (一般称为被观察者),依赖于该对象的对象被通知,并更新;

观察者模式:说明

1. 观察者模式是行为模式,也被称为:发布-订阅模式、模型-视图模式、源-监听器模式、从属者模;

2. 面对象过程中观察者模式的组成:

  1>. 抽象主题角色:这个角色里,定义维护了一份对观察者列表的管理集,一组用数组来存放,并定义了对一些基础的接口,比例用来添加跟删除观察者的方法;

  2>. 具体主题角色:这个角色,对于与客户,具体业务状态数据交互,并做一定的处理,然后再通知各个观察者 更新自己;

  抽象跟具体主题里的 一些常用的方法接口,如果 add|delete 或 notified方法,在哪个方法不是固定的; add跟delete也可以出现在 具体的主题角色里;

  3>. 抽象观察者角色:为所有观察者定义一个统一的接口,这个接口叫更新接口;

  4>. 具体观察者角色:实现抽象观察者角色的各自的更新方法;

3. 执行过程:

  

4. 观察者模式-结构图:

  

5. 场景实例描述:

  1>. 比如说母亲通知孩子吃饭的例子,一个家里有一两个孩子,这两个小孩子有点调皮,喜欢乱跑,妈妈把饭煮好了,但是看不到小孩的身影,叫也没见小孩回应回来的,所以妈妈就在小孩身上装了个 通知设备,一到把饭煮好,妈妈就在一个通知设备上按个按钮,就可以小孩身上的设备上发出声音:‘饭煮好了,快点回来吃饭’,然后小孩就可以马上回来吃刚上桌温热的饭菜了;

  2>. java的事件监听机制包括:事件源,事件监听器,事件对象;

    事件监听器相当于观察者,观察者用于提供统一的更新方法;

    事件源与事件对象相当于被观察者 (具体主题对象)

6. 观察者模式所应用到的原则: 对象的单一性质原则,开闭原则等;开闭原则所体现到的就是面对对象编码所提到要以接口来编程的原则,这样程序对象间就可以更好的复用及解耦;

7. 观察者模式主要组成: 被观察对象(目标对象, 具体对象, 主题), 观察者 (订阅者, 监听者), 事件(更新方法);

8. 当具体观察者对象的更新方法接收为普通类型数据,比如 string 时, 一般称为“推”模式;

  当 更新方法传递的是,被观察者(具体主题对象)时,一般被称为“拉”模式;

源码实例

1. 主题对象:

function Subject() {
this.Observers = [];
} Subject.prototype.add = function(observer) {
this.Observers.push(observer);
} Subject.prototype.remove = function(observer) {
var me = this;
for (idx in me.Observers) {
if (me.Observers[idx] == observer) {
me.Observers[idx].splice(idx, 1);
break;
}
}
} //推模式
Subject.prototype.notifyState = function(info) {
var me = this;
for (idx in me.Observers) {
me.Observers[idx].update(info)
}
} //接模式
Subject.prototype.notifyObservers = function(subject) {
var me = this;
for (idx in me.Observers) {
me.Observers[idx].updateSubject(subject)
}
}

2. 具体主体对象

function ConcreteSubject() {
Subject.call(this);
} ConcreteSubject.prototype.operate = function() {
var state = 'info';
this.notifyState(state);
this.notifyObservers(this);
}

3. 观察者对象A

function ConcreteObserverA() {
this.update = function(info) {
console.log('A Observer'+info);
}
  this.updateSubject = function(subject) {
console.log('A Observer object');
}
}

4. 观察者对象B

function ConcreteObserverB() {
this.update = function(info) {
console.log('B Observer'+info);
}
  this.updateSubject = function(subject) {
console.log('B Observer object');
}
}

5. 使用方法;

var subject = new ConcreteSubject();

var aobserver = new ConcreteObserverA();
var bobserver = new ConcreteObserverB(); subject.add(aobserver);
subject.add(bobserver); subject.operate();

其他说明

主题对象是可以多种不同存在的,就是上面的妈妈叫孩子吃饭例子,一个小区,一个小村庄会有多个的母亲,一个母亲下会有一个或几个的孩子;

母亲是被观察者,小孩们是观察者,他们在等待母亲主动推送消息通知他们去吃饭,但是小孩子回家的具体方式是不一样的,有的是马上跑回来,有的是慢慢吞吞回家去;

母亲是一个对象类,这个对象类当发生煮饭煮熟了,就会执行operate这个方法,去通知这小孩子的观察类对象,然后再更新自己回家去,在面向对象原则里,类要求功能单一职责,这有助于应用情况的扩展以及解耦;

[设计模式] Javascript 之 观察者模式的更多相关文章

  1. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  2. Java设计模式之《观察者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6513651.html 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监 ...

  3. Java设计模式百例 - 观察者模式

    观察者(Observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象.观察者模式又叫做发布-订阅(Publish/Subscribe ...

  4. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  5. 【读书笔记】读《JavaScript设计模式》之观察者模式

    一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象 ...

  6. [转] 浅析JavaScript设计模式——发布-订阅/观察者模式

    前一段时间一直在写CSS3的文章 一直都没写设计模式 今天来写写大名鼎鼎观察者模式 先画张图 观察者模式的理解 我觉得还是发布-订阅模式的叫法更容易我们理解 (不过也有的书上认为它们是两种模式……)  ...

  7. 前端中的设计模式 JavaScript

    最近再准备秋招,然后顺便把过去空白的设计模式相关概念补一补,这些内容都是从<JavaScript设计模式与开发实践>一书中整理出来的 (1)单例模式 定义:保证一个类仅有一个实例,并提供一 ...

  8. Java设计模式10:观察者模式

    观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...

  9. 大话设计模式C++版——观察者模式

    观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式.    这里以大话设计模式中的例子为例,办公室员工A.B.C在 ...

随机推荐

  1. Jenkins 2.x版本修改启动端口号(Windows)

    可能有一些原因,8080端口被占用了,无法使用时需要修改jenkins的启动端口号. 如果首次安装,建议先停止原有系统的8080端口占用,等jenkins安装完成后,再进行修改,然后该回8080的原系 ...

  2. Ext FileSystem Family、Ext2、Ext3

    catalog . 简介 . Ext2文件系统 . Ext3文件系统 . 小结 1. 简介 VFS虚拟文件系统接口和数据结构构成了一个框架,各个文件系统的实现都必须在框架内运转,但这并不要求每个文件系 ...

  3. 关于《加密与解密》的读后感----对dump脱壳的一点思考

    偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能在大三的时候遇到ISCC, ...

  4. 开发一个jQuery插件——多级联动菜单

    引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...

  5. 为什么 SharedPreferences 可以直接 调用,前面却没有对象

    获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法 2 调用Activity对象的getPreferences()方法 两 ...

  6. RabbitMQ之前的那些事

    RabbitMQ消息队列 RabbitMQ是一个消息队列的产品有着 集群.消息确认.内存化.高可用.镜像等高级功能,是目前MQ产品中的佼佼者 RabbitMQ的来历 它是用erlang语言遵守amqp ...

  7. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  8. iOS - Xcode7.3插件实效问题解决方法

    以往Xcode升级插件实效.1.关闭xcode 2.终端获取uid 3.文件中info.plist手动添加uid,现在不用了.在网上找的,特地记录一下,尤其是插件太多,不会麻烦了. 详细操作步骤: 关 ...

  9. Javascript面向对象编程

    https://segmentfault.com/a/1190000002900676 介绍 和java这种基于类(class-base)的面向对象的编程语言不同,javascript没有类这样的概念 ...

  10. FIFA halts 2026 bids amid scandal 国际足联在丑闻期间停止2026年足球世界杯申请

    FIFA halts 2026 bids amid scandal 国际足联在丑闻期间停止2026年足球世界杯申请 But official insists 2018 Cup will stay in ...