zoukankan      html  css  js  c++  java
  • JavaScript

    什么是观察者模式?

      这是一种创建松散耦合代码的技术。它定义对象间 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。由主体和观察者组成,主体负责发布事件,同时观察者通过订阅这些事件来观察该主体。主体并不知道观察者的任何事情,观察者知道主体并能注册事件的回调函数。

    观察者的两个要素

      观察者模式最重要的两个要素是:发布者、订阅者(观察者),发布者发送消息,订阅者订阅/删除特定消息并接受发布者发送的消息。

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

    小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼MM告诉小明,不久后还有一些尾盘推出,开发商正在办理相关手续,手续办好后就可以购买。

    // 定义售楼处
    var salesOffices = {};
    // 定义客户花名册
    salesOffices.clientList = [];
    // 定义订阅方法
    salesOffices.listen = function (key, fn) {
        // 花名册登记哪些客户订阅哪些信息(根据key来区分)
        if (!this.clientList[key]) {
            this.clientList[key] = [];
        }
        this.clientList[key].push(fn);
    }
    salesOffices.trigger = function () {
        // 获取key,获取第一个参数
        var key = Array.prototype.shift.call(arguments);
        var fns = this.clientList[key];
        if (!fns || fns.length === 0) {
            return false;
        }
        for (var i = 0, fn; fn = fns[i++];) {
            fn.apply(this, arguments);
        }
    }
    
    // 小明定于88平米的楼盘
    salesOffices.listen('squareMeter88', function (price) {
        console.log('price=' + price);
    });
    // 小红定于100平米的楼盘
    salesOffices.listen('squareMeter100', function (price) {
        console.log('price=' + price);
    });
    
    // 售楼处发布楼盘信息
    salesOffices.trigger('squareMeter88', 2000000);
    salesOffices.trigger('squareMeter100', 3000000);

    使用观察者模式的好处:

    1. 支持简单的广播通信,自动通知所有已经订阅过的对象。
    2. 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。
    3. 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。
  • 相关阅读:
    Scrapy之下载中间件与爬虫中间件
    Scrapy之twisted模块
    Scrapy之下载中间件中的代理中间件HttpProxyMiddleware
    Scrapy之start_urls、爬虫中间件之深度,优先级以及源码流程
    Scrapy之dupefilters(去重)以及源码分析/depth
    NOI 2013 书法家
    NOI2013 快餐店
    NOI2013 树的计数
    NOI2013 UOJ122 向量内积
    NOI2015
  • 原文地址:https://www.cnblogs.com/Mr-Tao/p/10995518.html
Copyright © 2011-2022 走看看