设计模式学习_javascript_观察者模式

什么是观察者模式

观察者模式,用于一和多之间,一改变的时候通知多进行相应的变化。现在我们通过一个栗子来看一下观察者模式是怎样的。

下面这个demo要是实现的效果就是通过ADD按钮添加CheckBox显示在下面的灰色div中,然后上面的CheckBox选择的时候下面的CheckBox进行相应的操作。可能项目不是很完整,基本上看一个思想就好。

这里写图片描述

下面来分析 一下
这里写图片描述

这里当最上面的CheckBox选中的时候就会通知观察者们,他们进行相应的处理,是选中还是不选中还是其他操作。下面看一下代码。

var ObserverPattern =(
        function (){

            //这是被观察者,它内部有一个ObserVerList数组用来存储观察者,还有一个方法用来移除观察者,最后有一个notify去通知观察者进行相应的操作。
            var Subject = function(){
            var ObserVerList=[];
            this.pushObserver = function(observer){

            ObserVerList.push(observer);
                return true;
            };
            this.removeObserver = function(index){

                if(index>=pushObserver.length||index<0)
                return false;
                ObserVerList.splice(index,1);

                return true;
            };
            this.notify = function(context){
                //通知所有的观察者
                ObserVerList.forEach(function(item){
                    console.log("context"+context);
                    item.update(context);
                });
              return true;
            };
        };

        //这是观察者,可以看成一个接口,update由观察者自己定义
        var Observer= function(){
            this.update= null;
        };

        //继承
        var extend =function(obj,extension){

            for(item in obj)
            extension[item] =obj[item];

        };
        return {
            Subject:Subject,
            Observer:Observer,
            extend:extend
        }

    })();

下面看一下具体的观察模式:

  window.onload=function(){


    var checkAll=document.getElementById("checkAll");
    var addBtn=document.getElementById("addBtn");
    var showCheck=document.getElementById("showCheck");

    ObserverPattern.extend(new ObserverPattern.Subject(),checkAll);
     var i=0;//当做CheckBox的下标
    addBtn.onclick=function(){
         i++;

        var chk=document.createElement("input");
        var brLine=document.createElement("br");
        chk.type="checkbox";
        showCheck.appendChild(chk);
        showCheck.appendChild(brLine);
        ObserverPattern.extend(new ObserverPattern.Observer(),chk);

        //添加到观察者列表
        checkAll.pushObserver(chk);


        chk.update=(function(i){
            var checkChoose = function(context){
                this.checked=context;
            }
            var checkUnChoose = function(context){
                this.checked=!context;
            }
            return (i%2==0)?checkChoose:checkUnChoose;
         })(i);

    }

    checkAll.onclick =  function(){
        if(i>0){
            checkAll.notify(this.checked);
        }else{
            this.checked=false;
            alert("add button first");
        }

    };
};

在window.onload的时候,先获取对应的控件对象,然后通过ObserverPattern.extend将checkAll这个CheckBox变成被观察者。接着监听ADD按钮的点击事件,去创建CheckBox然后添加到下面的DIV中。同时通过ObserverPattern.extend讲他们变成观察者。现在在checkAll的点击事件中去调用他的notify方法,通知观察他的所有观察者进行update。至此完成观察者模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值