JavaScript实现发布订阅模式

131 阅读1分钟
    /*Subject是被观察者,它的状态一旦发生变化,会通知所有的观察者*/
    class Subject {
        constructor(){
                this.state = "初始state";
                this.observers = [];//存放所有的观察者,一旦自身state改变,通知所有观察者
                this.addobserver = function (observertmp) {
                    this.observers.push(observertmp);
                }
                this.changeState = function (data) {
                    console.log("state发生改变,通知所有的订阅者(观察者)");
                    for(let i=0;i<this.observers.length;i++){
                        this.observers[i].update(data);
                    }
                    this.state = data;
                }
            }
    }

    //Observer是观察者,一旦被观察者改变,观察者就会调用自身Update方法
    class Observer{
            constructor(){
                this.update = function(data){
                    console.log("观察者:发现state发生变化,新state值为  "+data);
                }
        }
    }

    let observerOne = new Observer();
    let observerTwo = new Observer();
    let subject = new Subject();
    subject.addobserver(observerOne);
    subject.addobserver(observerTwo);

    /*被观察者state发生改变*/
    subject.changeState("new  state");

一旦被观察者state发生改变,所有观察者会收到新state:

image.png