[设计模式] Javascript 之 观察者模式

观察者模式:定议

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

观察者模式:说明

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这个方法,去通知这小孩子的观察类对象,然后再更新自己回家去,在面向对象原则里,类要求功能单一职责,这有助于应用情况的扩展以及解耦;

时间: 2024-08-27 22:40:55

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

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

一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象及其行为和状态之间的关系)的得力工具.用JavaScript的话来说,这种模式的实质就是你可以对程序中某个对象的状态进行观察,并且在其发生改变时能够得到通知. 二.例子 我们需要一个发布者的构造函数,它为该实例定义了一个类型为数组的属性,用来保存订阅者的引用. function Publisher(

设计模式学习之观察者模式(Observer,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3.使用观察者模式的好处:维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便.什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. private static void M

【C++深入浅出】设计模式学习之观察者模式

前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使他们能够自动更新自己. 通过一张visio的UML图片介绍一下子功能关系. subject类:抽象通知者类,一般用一个抽象类或者接口实现,把所有对观察者的引用都放到一个集合里,每个抽象通知者类可以有任意数量的观察者,抽象通知者类提供一个接口

设计模式-单例模式,观察者模式

序言 咳咳,今天起,我要把对设计模式的理解心得,用全新的案例去分析,分享给大家.希望大家能够喜欢. 观察者模式 举例阐述:游戏情节,一颗小男孩,丢到众多鬼子附近,爆炸啦,根据炸弹的威力计算爆炸后鬼子的血量,假定有些鬼子有防具,有些鬼子没有防具. 分析:这种情况,使用观察者模式是比较理想的,因为观察者模式的就是是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新. 定义:在观察者模式中,上述小男孩被称为主题,而小鬼子们就被称为观察者. 下面我用代码,把举例给演示出

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

前一段时间一直在写CSS3的文章 一直都没写设计模式 今天来写写大名鼎鼎观察者模式 先画张图 观察者模式的理解 我觉得还是发布-订阅模式的叫法更容易我们理解 (不过也有的书上认为它们是两种模式……) 这就类似我们在微信平台订阅了公众号 当它有新的文章发表后,就会推送给我们所有订阅的人 我们可以看到例子中这种模式的优点 我们作为订阅者不必每次都去查看这个公众号有没有新文章发布, 公众号作为发布者会在合适时间通知我们 我们与公众号之间不再强耦合在一起.公众号不关心谁订阅了它, 不管你是男是女还是宠物

ruby和javascript的观察者模式

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现. 实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则.无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用. 观察者模式在ruby中的是实现 1 mo

设计模式JavaScript实现

GoF合作出版的<设计模式>这本书提供了许多有关与面向对象软件设计中常见问题的解决方案.这些模式已经出现了相当长的一段时间,已经被证明在许多情况下都非常有用. 单体模式 一个特定类仅有一个实例.这意味着当您第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同对象. 使用对象字面量创建一个简单的对象也是一个单体的例子,因为在JavaScript中没有类,只有对象.当您创建一个新对象时,实际上没有其他对象与其类似,因此新对象已经是单体了. var obj = { myprop:

我理解设计模式C++实现观察者模式Observer Pattern

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

设计模式:(4)观察者模式

现实生活中,这样的例子太多了,一个对象的状态受另外一个对象的影响.比如,进度条根据上传的百分比而变化,红灯停绿灯行.....这样的业务数不胜数.甚至我们有时候心情也是随着很多经历而变化.在开发过程中,这样的业务当然也是很多的,但是,稍有不慎,我们可能会实现出比较麻烦的代码.而设计模式中有一种模式对于解决这样的业务具有很好作为,那就是观察者模式.简而言之就是:我们有一个目标,还有很多观察者,当目标变化,观察者们将作出相关的变化. 观察者模式: 看看书上的定义,也是行为模式 意图: 定义对象间的一种