• 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. 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。
  • 相关阅读:
    49. Group Anagrams
    43. Multiply Strings
    22. Generate Parentheses
    17. Letter Combinations of a Phone Number
    8. String to Integer (atoi)
    【转】C#中base关键字的几种用法:base()
    【转】C#中virtual和abstract的区别
    [转]C#中的abstract 类和方法
    【转】C#虚方法virtual详解
    【转】C#中protected用法详解
  • 原文地址:https://www.cnblogs.com/Mr-Tao/p/10995518.html
Copyright © 2020-2023  润新知