美文网首页
设计模式之观察者模式

设计模式之观察者模式

作者: 写前端的大叔 | 来源:发表于2020-02-10 21:43 被阅读0次

最近准备看vue的源码,为了更轻松的阅读源码,首先需要对Observer模式进行了解,Observer模式是很常见的一种设计模式,使用该模式能方便的观察其它对象的变量,当被观察对象发生改变时,可以通知其它关联的对象进行更新。那些主流的MVVM框架都运用了该模式,通过观察对象属性的变量,对界面进行更新,实现数据的双向绑定。

使用场景

观察者模式不论在生活中和编程中都很常见,生活中跟我们息息相关的就是面试,当我们去别的公司面试完后,面试官都让我们回去等待通知,当有面试结果时就会通知我们,我们面试的人就属于订阅者,面试官就属于发布者了,当有面试结果后,面试官会拨打电话或发offer,这个就是通知面试者的一个事件。
在编程中观察都模式也很常见,如下所示:

  • 网页事件绑定
  • Promise
  • jQuery callbacks
  • nodejs 自定义事件

下面通过两种方式来完成观察者模式的实现。

实现1

        //观察者
        class Observer{
            constructor(name,subject){
                this.name = name;
                this.subject = subject;
                this.subject.addObserver(this);
            }

            update(){
                console.log(`${this.name}:${this.subject.getState()}`)
            }
        }
        //被观察者
        class Subject {
            constructor(){
                this.state = 0;
                this.observers = [];
            }

            getState(){
                return this.state;
            }
            setState(state){
                this.state = state;
                this.notifyAllObservers();
            }

            addObserver(observer){
                this.observers.push(observer);
            }

            notifyAllObservers(){
                this.observers.forEach(item => {
                    item.update();
                })
            }
        }
        var subject = new Subject();
        var o1 = new Observer('o1',subject);
        var o2 = new Observer('o2',subject);
        var o3 = new Observer('o3',subject);
        var o4 = new Observer('o4',subject);
        subject.setState(1);
        subject.setState(11);
        subject.setState(111);

实现2

          class PubSub{
            constructor(){
                this.observers = {};
            }
            on(name,fn){
                if(!this.observers.hasOwnProperty(name)){
                    this.observers[name] = [];
                }
                if(typeof fn === 'function'){
                    this.observers[name].push(fn);
                }
            }

            emit(name,...args){
                if(this.observers.hasOwnProperty(name)){
                    this.observers[name].forEach(fn => {
                        fn.apply(null,args)
                    })
                }
            }
        }

        var pub = new PubSub();
        pub.on('click',function(){
            console.log('1点击了哦!')
        })
        pub.on('click',function(){
            console.log('2点击了哦!')
        })
        pub.emit('click');

该实现方式一般可用于创建自定义事件,在一些开源的源码中很常见。

相关文章

网友评论

      本文标题:设计模式之观察者模式

      本文链接:https://www.haomeiwen.com/subject/cavzxhtx.html