• 简单认识 观察者模式和订阅者模式的区别?


    /*
        观察者模式和 订阅模式的区别?
        就是发布订阅模式有个事件调度中心。
    
    */
    
    
    一、观察者模式
    
                   触发事件
            目标 ------------》观察者
                《------------
                  订阅目标
                  
    二、订阅者模式?
        
        目标----发布消息----》调度中心-------触发事件----》订阅者
        
        订阅者----订阅-------》调度中心
    
    三、分析订阅者模式和观察者模式的不同之处。
    /*
        观察者模式是观察者和目标直接进行交互,
        发布订阅式模式可以实现更细粒度的一些控制。
        发布者可以控制自己发布的消息,不让某些订阅者接收到。可以在调度中心
        进行相关的处理,类似于权限控制。 还可以做一些节流操作。
        
            
    */
    
    四、观察模式代码的具体实现
    
    
    // 观察者   我的粉丝都是我的观察者
    class Observer{
        constructor(){
            
        }
        
        update(val){
            
        }
    }
    
    // 观察者列表   就是粉丝的数量
    class ObserverList{
        constructor(){
            this.observerList = []
        }
        
        add(observer){
            return this.observerList.push(observer);
        }
        
        remove(observer){
            this.observer = this.observerList.filter(ob=> ob !== observer);
        }
        
        count(observer){
            return this.observerList.length;
        }
        
        get(index){
            return this.observerList[index];
        }
    }
    
    //目标   我是主播。是被观察的目标。
    class Subject{
        constructor(){
            this.observer = new ObserverList();
        }
        
        addObserver(observer){
            this.observer.add(observer);
        }
        
        removeObserver(observer){
            this.observer.remove(observer);
        }
        
        notify(...args){
            let obCount = this.observer.count();
            for (let index=0; index < obCount; index++){
                this.observer.get(i).update(...args);
            }
        }
    }
    
    
    订阅者模式?    
    class PubSub{
        //构造函数,构造器
        constructor(){
            this.subscribe ={}
        }
        
        // 订阅
        subscribe(type,fn){
            if(!Object.prototype.hasOwnProperty.call(this.subscribe,type)){
                this.subscribe[type]=[];
            }
            this.subscribe[type].push(fn);
            
        }
        
        unsubscribe(type,fn){
            let listeners = this.subscribe[type];
            if(!listeners || !listeners.length) return;
            this.subscribe[type] = listeners.filter(v =>v !== fn);        
        }
        
        publish(type, ...args){
            let listeners = this.subscribe[type];
            if(!listeners || !listeners.length) return;
            listeners.forEach(fn => fn(...args));
        }
    }
    
    let ob= new PubSub();
    ob.subscribe('add',(val)=> console.log(val));
    ob.publish('add',1);
    
    /*
        观察者模式有具体目标调度,每个被订阅的目标里都需要有对观察者的处理
        会造成代码的冗余,
        
        发布订阅模式则有统一由调度中心处理,消除了发布者和订阅者之间的依赖。
        
        
        
    
    */
    
    
    总结!
    /*
        观察者模式的优点
            实现表示层和数据逻辑层的分离。
            在观察目标和观察者之间建立一个抽象的耦合,支持广播通信。
            
        缺点:
            如果一个观察目标对象有很多直接和间接的观察者,
    
    */

    记录。

  • 相关阅读:
    每天一个linux命令(9):touch
    每天一个linux命令(8):rm
    每天一个linux命令(7):mv
    每天一个linux命令(6):cp
    每天一个linux命令(5):rmdir
    每天一个linux命令(4):mkdir
    区块链技术与应用——BTC挖矿难度
    区块链技术与应用——BTC网络工作原理
    区块链技术与应用——BTC系统实现
    区块链技术与应用——BTC的共识协议
  • 原文地址:https://www.cnblogs.com/ZXF6/p/11822736.html
Copyright © 2020-2023  润新知