javascript观察者模式

观察者模式的定义app

观察者模式它定义了对象间的一种一对多的依赖关系,this

只要当一个对象的状态发生改变时,全部依赖于它的对象都获得通知并被自动更新spa

与观察者模式相似的还有一个发布订阅是在中间多了一个相似于中转的层prototype

观察者模式中有观察者和被观察者两个角色,举个栗子,好比租房子,你(观察者)想租某个地方的房子(被观察者),code

你去找了中介并留下了手机号(订阅)可是中介告诉你房源紧张,没有房子了,若是有了房子  他就会通知你(发布),对象

若是你有了房子,她就不会再联系你了(取消订阅),这就是一个生活中的观察者模式blog

观察者模式的使用io

        //  一个中介class
        class Mediation {
            constructor(){
                // 订阅人电话列表
                this.peoplePhoneList = {}
            }        
            // 留手机号 订阅
            addPhone(key, fn) { 
                if (!this.peoplePhoneList[key]) {
                    // 这我的以前是否登记过手机号
                    this.peoplePhoneList[key] = []; 
                }
                // 把适合他的房子信息存起来
                this.peoplePhoneList[key].push(fn); 
            };
            // 打电话 发布
            callPhone() { 
                // 根据电话号码 找到这我的
                var key = Array.prototype.shift.call(arguments); 
                let msg = this.peoplePhoneList[key];

                if (!msg || msg.length === 0) {
                    return false; 
                }
                for (var i = 0; i < msg.length; i++) {
                    // 把这我的合适的房子信息告诉他
                    msg[i].apply(this, arguments); 
                }
            };
            // 找到房子 取消订阅
            noLike(key, fn) { 
                // 按电话找到这我的
                var msg = this.peoplePhoneList[key];
                if (!msg) {
                    return false; 
                }
                if (!fn) {
                    // 取消这我的的信息
                    delete this.peoplePhoneList[key]; 
                } else {
                    //   取消掉他不喜欢的房子
                    for (var i = 0; i < msg.length; i++) {
                        if (fn === msg[i]) {
                            msg.splice(i, 1); 
                        }
                    }
                }
            };
        };
        var homeA = function (person,data) {
            console.log(person+data + ',咱们找到了一个鹿港的房子');
        }
        var homeB = function (person,data) {
            console.log(person+data + ',咱们找到了一个石油家园的房子');
        }
        // 中介A
        MediationA = new Mediation
        // 中介B
        MediationB = new Mediation

        // 找到A先生合适的两套房子
        MediationA.addPhone('13800138000', homeA);
        MediationA.addPhone('13800138000', homeB);
        // 找到B先生合适的两套房子
        MediationB.addPhone('15012345678', homeA);
        MediationB.addPhone('15012345678', homeB);
        // 打电话告诉他们
        MediationA.callPhone('13800138000','13800138000', '中介A');
        MediationB.callPhone('15012345678', '15012345678','中介B');

        // 中介B被pass了一个
        MediationB.noLike('15012345678',homeB)
        MediationB.callPhone('15012345678', '虽然被pass可是一点都不慌,','中介B');

打印结果console

相关文章
相关标签/搜索