JavaScript设计模式(一)

189 阅读2分钟

一、观察者模式

  • 概念:又称“ 发布-订阅(Publish/Subscribe)”,发布者有了新的内容,需要向订阅者推送数据,若订阅者退订了则要对发布者中的订阅者列表进行更新。
  • 功能:当一个对象发送改变时,多个对该对象依赖的其他对象也会相对应做出改变。可以根据需要增加或删除对象,解决一对多对象间的耦合关系。
  • 具体代码:
//创建发布者,对发布者新增操作 获取/更新
    function Publisher(obj){
        this.observers = [];
        let state = obj.value;
        this.getState = function () {
            return state;
        }
        this.setState = function(value){
            state = value;
            this.notice()
        }
        thi s.obj = obj;
    }
//新增发布者方法:添加观察者、删除观察者、通知观察者
    Publisher.prototype.addOb = function (observer) {
        var flag = false;
        for (i = observer.length-1;i>=0;i++){
            if(this.observers[i] = observer){
                flag = true;
            }
        }
        if(!flag){
            this.observers.push(observer);
        }
    }
    Publisher.prototype.notice=function(){
        var observers = this.observers;
        for (var i = 0; i < observers.length; i++) {
            observers[i].update(this.getState());
        }
    }
//创建一个订阅对象,内含修改方法
    function Subscribe(obj){
        this.obj = obj;
        this.update = function(data){
            window.console.log(data)
            this.obj.value = data;
        }
    }
//实例化发布者与订阅者
    let oba = new Publisher(document.getElementById('input'));
    let obd = new Subscribe(document.getElementById('div'));
    //添加订阅者
    oba.addOb(obd);
//订阅者监听
    obd.update = function (state) {
        this.obj.innerText = state;
    }
//监听键盘输入事件
    oba.obj.addEventListener('keyup',function () {
        oba.setState(this.value);
    })

4.练习总结

  • input作为发布者,实例化Publisher,div作为订阅者,实例化Subscribe
  • 发布者需要的方法有:数据获取、数据设置、添加观察者、删除观察者、通知观察者监听
  • 观察者需要的方法:获取数据更新 5.练习代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <input type="text" id="input">
    <div id="div"></div>
    </body>
    </html>
    <script>
        //创建发布者,对发布者新增操作 获取/更新
        function Publisher(obj){
            this.observers = [];
            let state = obj.value;
            this.getState = function () {
                return state;
            }
            this.setState = function(value){
                state = value;
                this.notice()
            }
            this.obj = obj;
        }
        //新增发布者方法:添加观察者、删除观察者、通知观察者
        Publisher.prototype.addOb = function (observer) {
            var flag = false;
            for (i = observer.length-1;i>=0;i++){
                if(this.observers[i] = observer){
                    flag = true;
                }
            }
            if(!flag){
                this.observers.push(observer);
            }
        }
        Publisher.prototype.notice=function(){
            var observers = this.observers;
            for (var i = 0; i < observers.length; i++) {
                observers[i].update(this.getState());
            }
        }
        //创建一个订阅对象,内含修改方法
        function Subscribe(obj){
            this.obj = obj;
            this.update = function(data){
                window.console.log(data)
                this.obj.value = data;
            }
        }
        //实例化发布者与订阅者
        let oba = new Publisher(document.getElementById('input'));
        let obd = new Subscribe(document.getElementById('div'));
        //添加订阅者
        oba.addOb(obd);
        //订阅者监听
        obd.update = function (state) {
            this.obj.innerText = state;
        }
        //监听键盘输入事件
        oba.obj.addEventListener('keyup',function () {
            oba.setState(this.value);
        })
    </script>