发布-订阅模式 VS 观察者模式

发布-订阅模式

在24种设计模式中并没有发布-订阅模式,它是由观察者模式发展而来的。它主要是面向调度中心编程的,用于解耦发布者和订阅者。

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

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

    publish(topic, ...args) {
        let topics = this.subscribers[topic] || [];
        console.log(topics);
        topics.forEach(value => value(...args));
    }
}

let pub_sub = new PubSub();
pub_sub.subscribe('msg', console.log);
pub_sub.subscribe('msg', alert);
pub_sub.publish('msg', 'You have a news');


观察者模式

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式是面向目标和观察者编程的,用于耦合目标和观察者。

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');

评论(0)

评论