(前端手撕) 8. 手写发布订阅者和观察者模式

手写发布订阅者和观察者模式

1. 观察者模式

 class Subject {
            constructor() {
                this.observers = [];
            }

            add(observer) {
                this.observers.push(observer);
            }

            notify(...args) {
                this.observers.forEach(observer => observer.update(...args));
            }
        }

        class Observer {
            update(...args) {
                console.log(...args);
            }
        }

        // 创建观察者ob1
        let ob1 = new Observer();
        // 创建观察者ob2
        let ob2 = new Observer();
        // 创建目标sub
        let sub = new Subject();
        // 目标sub添加观察者ob1 (目标和观察者建立了依赖关系)
        sub.add(ob1);
        // 目标sub添加观察者ob2
        sub.add(ob2);
        // 目标sub触发SMS事件(目标主动通知观察者)
        sub.notify('I fired `SMS` event');

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

2. 发布订阅者模式

class PubSub {
            constructor () {
                this.subscribers = [];
            }

            subscribe(topic, callback) {
                letcallbacks = this.subscribers[topic];
                if (!callbacks) {
                    this.subscribers[topic] = [callback];
                } else {
                    callbacks.push(callback);
                }
            }

            publish(topic, ...args) {
                letcallbacks = this.subscribers[topic] || [];
                callbacks.forEach(callback => callback(...args));
            }
        }

        // 创建事件调度中心,为订阅者和发布者提供调度服务
        letpubSub = newPubSub();
        // A订阅了SMS事件(A只关注SMS本身,而不关心谁发布这个事件)
        pubSub.subscribe('SMS', console.log);
        // B订阅了SMS事件
        pubSub.subscribe('SMS', console.log);
        // C发布了SMS事件(C只关注SMS本身,不关心谁订阅了这个事件)
        pubSub.publish('SMS', 'I published `SMS` event');
全部评论

相关推荐

03-05 17:03
已编辑
浙江工商大学 C++
陈好好wy:整体看下来有点空空的感觉,可以把每一段项目经历都再完善一下,然后用小标题的形式写个两到三条,目前看有点太简单了,不太能看出具体在这个项目里做了什么工作。还是要尽量把自己做的工作以量化的形式体现在简历上呢。
双非本科求职如何逆袭
点赞 评论 收藏
分享
零零幺零零幺:至少再做一个项目,然后猛投小厂,不然有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务