zoukankan      html  css  js  c++  java
  • 设计模式~观察者模式和发布订阅模式的比较:

    设计模式~观察者模式和发布订阅模式的区别

    1,简单区分:,

    • 观察者模式:观察者+被观察者 (观察者与被观察者~紧耦合)          被观察者更新内容后,直接通知观察者
    • 发布订阅模式:订阅者+ 经纪人(中间人) + 被订阅者(观察者与被观察者~完全不耦合),被订阅者更新内容后,是先通知经纪人,经纪人再发布给订阅者。

    2,设计模式解析+举例子:

    观察者模式:微博大V(被观察者)内部创建有一个粉丝集合(存放观察者),这里对于粉丝需要先注册该大V(才能成为该大V的粉丝,即与该大V建立联系),

    然后两者之间有联系后,大V再发布微博,就会将更新状态直接通知粉丝。

    ✿ 观察者模式的设计在被观察者内部创建有一个存放观察者的集合(外部的观察者通过注册,被存放进该观察者集合),一旦有消息更新,被观察者,

    只需要调用一个方法,就可以直接通知到所有的观察者。

    观察者模式代码示例:

    // 观察者
    class Observer {
        constructor() {
    
        }
        update(val) {
    
        }
    }
    // 观察者列表
    class ObserverList {
        constructor() {
            this.observerList = []
        }
        add(observer) {
            return this.observerList.push(observer);
        }
        remove(observer) {
            this.observerList = this.observerList.filter(ob => ob !== observer);
        }
        count() {
            return this.observerList.length;
        }
        get(index) {
            return this.observerList[index];
        }
    }
    // 目标
    class Subject {
        constructor() {
            this.observers = new ObserverList();
        }
        addObserver(observer) {
            this.observers.add(observer);
        }
        removeObserver(observer) {
            this.observers.remove(observer);
        }
        notify(...args) {
            let obCount = this.observers.count();
            for (let index = 0; index < obCount; index++) {
                this.observers.get(i).update(...args);
            }
        }
    }

    发布订阅模式:之前是大V将消息直接发送给所有粉丝,但是消息有好消息跟坏消息,粉丝有黑粉真粉,为了消息更好的被接收,获取到更多的利益,

    V选择了一个经纪人(broker)经纪人通过分类,将大V 的内容划分成不同的主题,提供给不同粉丝选择。(订阅者实现一种多样化选择)


    ✿ 发布订阅模式的设计:被订阅者内部有一个经纪人,在经纪人内部有存放根据类型划分的粉丝集合对象 {对象的元素可以是类型粉丝数组}

    发布订阅模式代码示例:

    /*发布者(经纪人)*/
    class PubSub {
      constructor() {
      //存放类型粉丝的对象
    this.subscribers = {} } subscribe(type, fn) { //判断 subscribers[type]是否存在 if (!Object.prototype.hasOwnProperty.call(this.subscribers, type)) { this.subscribers[type] = []; } this.subscribers[type].push(fn); } unsubscribe(type, fn) { let listeners = this.subscribers[type]; if (!listeners || !listeners.length) return; this.subscribers[type] = listeners.filter(v => v !== fn); } publish(type, ...args) { let listeners = this.subscribers[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);
  • 相关阅读:
    一个简单XQuery查询的例子
    《Microsoft Sql server 2008 Internals》读书笔记第七章Special Storage(1)
    《Microsoft Sql server 2008 Internals》读书笔记第八章The Query Optimizer(4)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(4)
    SQL Server中SMO备份数据库进度条不显示?
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(5)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(3)
    《Microsoft Sql server 2008 Internal》读书笔记第八章The Query Optimizer(2)
    省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例
    FireFox意外崩溃时的手工恢复命令
  • 原文地址:https://www.cnblogs.com/shan333/p/15232232.html
Copyright © 2011-2022 走看看