观察者模式实例问题

今天碰到了这样一个有关观察者模式的问题:
题目:有一个对象a,然后有一个属性props,当我的props变化后,b输出props变化
然后自己觉得代码应该如下:

var PubSub = (function() {  
    var eventObj = {};
    var props = 1;
    //订阅
    var subscribe = function(event, fn) {
            var props = arguments[0];
            if(props != 1){  //监测是否变化
              eventObj[event] = fn;
            }
        };
    //发布
    var publish = function(event) {
            if (eventObj[event]){
              eventObj[event]();
            }
        };
  
    return {
        subscribe: subscribe,
        publish: publish
    }
}());

var props2 = 2; //如果这里props2 = 1则不会输出
PubSub.subscribe(props2, function() {  
    console.log('props被修改为'+props2);
});

PubSub.publish(props2); 

对于观察者模式其实有点理解,但是暂时还不是很懂该怎么用代码的形式写出来,不知道自己这样写是否正确,跪求大神指点

阅读 3.6k
4 个回答

我本身是做java开发的,使用的观察者模式也是java来实现的,我换成javascript来实现下(参考下),

function A(){
    this.observers = [];//保存被观察者对象
}


A.prototype.setProps = function(props){
     this.props = props;
    //通知观察者
    for(var i = 0;i < this.observers.length;i++){
           this.observers[i].update(this,props);
    }
};

A.prototype.getProps = function(props){
     return this.props;
};


//添加观察者
A.prototype.addObserver = function(observer){
    for(var i = 0;i < this.observers.length;i++){
        if(this.observers[i] == observer){//已经存在直接返回
                return;
        }
    }
    this.observers.push(observer);
};

//移除观察者
A.prototype.removeObserver = function(observer){
    for(var i = 0;i < this.observers.length;i++){
        if(this.observers[i] == observer){
                this.observers = this.observers.splice(i,1);
              return;
        }
    }
};

//观察者1
var b = {};
b.update = function(observerable,data){
       alert("b->"+data);
};

//观察者2
var c = {};
c.update = function(observerable,data){
      alert("c->" + data);
};

//被观察的对象
var a = new A();
//添加观察者b
a.addObserver(b);
//添加观察者c
a.addObserver(c);
//当prop属性改变的时候,会自动调用观察者的update()方法。
a.setProps("helloworld");
//删除观察者b
a.removeObserver(b);
a.setProps("helloworld2");
//本例子可以写成优化为使用继承的方式来实现,达到代码的复用。

观察者模式(订阅发布模式)应该是,可以有多个订阅者,各个订阅者之间不相互感知,发布者也不关心有多少人订阅它,这一点,你的实现中没有体现出来。

还差取消订阅的功能

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题