设计模式--观察者模式

设计模式:

一、行为型-观察者模式

 
观察者模式(Observer)又被称为发布者-订阅者或消息机制。定义依赖关系,解决主体对象与观察者之间的功能的耦合

创建观察者模式

var Observer = (function(){
       let  _messages={} 
       return {
        regist: function(type, fn){ // type注册名字, fn传入的回调函数
          if(typeof _messages[type]==="undefined"){ //  type不存在的时候
            _messages[type]=[fn]  
          } else { // type已经存在也就是同名的时候入栈
            _messages[type].push(fn)
          }
          console.log("22regist", _messages)
        },
       
       }
    })()

注册事件

 Observer.regist('test', function(e){
       console.log('test####11',e, e.type, e.args.msg)
     })
     Observer.regist('test', function(e){
       console.log("test****", e, e.type, e.args,  e.args.msg)
     })
     Observer.regist('test22', function(e){
       console.log("test22****", e, e.type, e.args,  e.args.msg)
     })
     Observer.regist('test33', function(e){
       console.log("test33****",e, e.type, e.args)
     })

打印

 var Observer = (function(){
       let  _messages={}
       return {
        regist: function(type, fn){ // type注册名字, fn传入的回调函数
          if(typeof _messages[type]==="undefined"){ //  type不存在的时候
            _messages[type]=[fn]  
          } else { // type已经存在也就是同名的时候入栈
            _messages[type].push(fn)
          }
          console.log("22regist", _messages)
        },
         fire: function(type, args){ // type注册名字, args传的参数
          // console.log(!_messages[type],_messages[type], "fire11", type, args)
          if(!typeof _messages[type]){ // 
            return
          }
          let events={
            type: type,
            args: args || {}
          }
          for(let i =0; i<_messages[type].length;i++){
            _messages[type][i].call(this, events)
          }

         },
         remove: function(type, fn){
           if( _messages[type] instanceof Array){
             let i = _messages[type].length-1
             for(; i>=0; i--){
                _messages[type][i] === fn && _messages[type].splice(i, 1)
             }
            }

         }
       }
    })()

发布

     Observer.regist('test', function(e){ // 注册type为"test"的函数
       console.log('test####11',e, e.type, e.args.msg)
     })
     Observer.regist('test', function(e){ // 注册type为"test"的函数
       console.log("test****", e, e.type, e.args,  e.args.msg)
     })
     Observer.regist('test22', function(e){
       console.log("test22****", e, e.type, e.args,  e.args.msg)
     })
     Observer.regist('test33', function(e){
       console.log("test33****",e, e.type, e.args)
     })
     Observer.fire('test', {msg:'传递参数'})  // 发布者

 

注册type为"test"的函数都执行了

 

Observer.fire('test', {msg:'传递参数'})
Observer.fire('test22', {msg:'hello world'})

 

remove这个删除是删除不掉的, 删除的函数和注册的时候时候不是同一个回调函数这个需要注意的
 Observer.remove('test33', function(e){  
      console.log("test33****",e, e.type, e.args)
 })

 

可以打印看一下

        remove: function(type, fn){
           console.log(_messages[type].length, type, _messages[type], '-------remove-----', _messages[type] instanceof Array)
           if( _messages[type] instanceof Array){
             let i = _messages[type].length-1
             for(; i>=0; i--){
               console.log('remove22---i--', i, typeof _messages[type][i], _messages[type][i] === fn)
              _messages[type][i] === fn && _messages[type].splice(i, 1)
             }
           }
         }

 

对象间解耦

 // 学生类
      const Student= function(result){
       let that = this
        // 学生回答结果
        that.result = result;
        that.say = function(){ // 不能传参数
          console.log('student-学生回答结果-->',that.result)
        }
        
      }

      Student.prototype.answer = function(question){
        // console.log(this.result, '', question, '已经被注册')
        Observer.regist('question', this.say);
      
      }
      Student.prototype.sleep = function(question){
        // console.log(this.result, '', question, '已经被注销')
        Observer.remove('question', this.say);
       
      }

      const Teacher = function(){}
      Teacher.prototype.ask= function(question){
         console.log('问题是', question)
         // 发布提问消息
         Observer.fire('question')
      }

 

      let  student1= new Student('学生1回答的问题')
      let  student2= new Student('学生2回答的问题')
      let  student3= new Student('学生3回答的问题')

       student1.answer('学生1设计模式')
       student2.answer('学生2简述观察者模式')
       student3.answer('学生3简述历史至大米')

      //  student2.sleep('学生三睡着简述观察者模式')

       let teather = new Teacher()
       teather.ask('老师提问问题1: 什么是设计者模式')
       teather.ask('老师提问2: 简述观察模式')

 

 

student2.sleep('学生三睡着简述观察者模式')

 

-------陆续更新中--------

 

posted @ 2021-09-09 21:17  pikachuWorld  阅读(60)  评论(0编辑  收藏  举报