重温发布订阅

本文深入讲解了观察者模式的定义及实现方式,通过一个具体的代码示例,展示了如何使用观察者模式来创建对象间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖的对象会自动收到通知并进行更新。

定义

观察者模式定义了对象之间一对对多的依赖关系,当一个对象改变了状态,它的所有依赖会被通知,然后自动更新。

  1. 订阅:将所有的事件统一放入事件池中(this.planList)中
  2. 发布:时机到来执行$plan.fire(),把所有的方法都执行
  3. 取消订阅:$plan.remove(fn3),取消就是在事件池中找到这个方法,然后删除。

~(function() {
    let each = (ary,callbacks) => {
        for(var i = 0; i< ary.length; i++) {
            let reault = callbacks && callbacks(ary[i],i);
            if(reault === false) break;
            if(reault === 'DEL') i--;
        }
    }
    
    class Plan {
        constructor() {
            this.planList = [];
        }
        // 添加方法
        add(fn) {
            let planList = this.planList,
            flag = true;
            each(planList,(ary, index) => {
                if(fn === ary) {
                    flag = false;
                    return false;
                }
            })
            flag && planList.push(fn);
        }
        // 删除方法
        remove(fn) {
            let planList = this.planList;
            each(planList, (item, index) => {
                if(fn === item) {
                    planList[index] = null;
                    return false;
                }
            })
        }
        // 触发方法
        fire(...arg) {
            let planList = this.planList;
            each(planList, (item, index) => {
                if(item === null) {
                    planList.splice(index,1)
                    return 'DEL';
                }
                item(...arg)
            })
        }

        static CallBacks () {
            return new Plan();
        }
    }
    window.$ = window.Plan = Plan;
})()

let $plan = $.CallBacks();
fn1 = () => {
    console.log('第一件事')
}
$plan.add(fn1); // 订阅:第一件事物
fn2 = () => {
    console.log('第二件事')
}
$plan.add(fn2); // 订阅:第二件事物
fn3 = () => {
    console.log('第三件事')
}
$plan.add(fn3); // 订阅:第三件事物
$plan.remove(fn3); // 删除第三件事物
$plan.fire(); // 发布:第一件事 第二件事
复制代码

转载于:https://juejin.im/post/5c8b923c5188257ed47b2030

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值