JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式

这篇具有很好参考价值的文章主要介绍了JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

设计模式

内容 参考链接
JavaScript设计模式(一) 构造器模式、原型模式、类模式
JavaScript设计模式(二) 简单工厂模式、抽象工厂模式、建造者模式
JavaScript设计模式(三) 单例模式、装饰器模式、适配器模式

✨✨前言

大家好,这里是前端杂货铺。

上一节,我们学习了策略模式、代理模式、观察者模式。这一节,我们学习发布订阅模式、桥接模式和组合模式…

一、发布订阅模式

观察者和目标要互相知道,发布者和订阅者 不用相互知道,通过第三方实现调度,属于 经过解耦合的 观察者模式。

我们定义 PubSub 类(发布订阅),里面的 message 对象用于存放要订阅的信息。

subscribe 方法期待两个参数(type 和 cb),type 表示要订阅的类型,cb 表示订阅的详细信息,直接把 cb 赋值给 type 即可。

publish 方法也期待两个参数(type 和 data),如果发布的时候没有该类型,则直接 return,否则发布出该类型。

unsubscribe 同 subscribe 一样,期待两个参数,用于取消订阅。

class PubSub {
    message = {};
    // 发布
    publish(type, data) {
        // 发布的时候没有该类型,直接 return
        if (!this.message[type]) return;
        this.message[type].forEach(item => item(data));
    }
    // 订阅
    subscribe(type, cb) {
        this.message[type] = [cb];
    }
    // 取消订阅
    unsubscribe(type, cb) {
        // 取消订阅的时候如果没有该类型,直接 return
        if (!this.message[type]) return;

        if (!cb) {
            this.message[type] && (this.message[type].length = 0);
        } else {
            this.message[type] = this.message[type].filter(item => item !== cb);
        }
    }
}

// 创建 pubsub 实例
const pubsub = new PubSub();

function milk(data) {
    console.log('milk', data);
}

function apple(data) {
    console.log('apple', data);
}

function chicken(data) {
    console.log('chicken', data);
}

// 订阅 牛奶、苹果、大盘鸡
pubsub.subscribe('milk', milk);
pubsub.subscribe('apple', apple);
pubsub.subscribe('chicken', chicken);

// 发布 牛奶、苹果、大盘鸡
pubsub.publish('milk', '牛奶');
pubsub.publish('apple', '苹果');
pubsub.publish('chicken', '大盘鸡');

console.log('分-----割-----线')

// 取消对大盘鸡的订阅
pubsub.unsubscribe('chicken');

// 发布 牛奶、苹果、大盘鸡(大盘鸡不会被发布,因为被取消订阅了)
pubsub.publish('milk', '牛奶');
pubsub.publish('apple', '苹果');
pubsub.publish('chicken', '大盘鸡');

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式


二、桥接模式

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

使用场景:一个类存在两个或多个独立变化的维度,且这两个维度都需要进行扩展。

优点:把抽象与实现隔开,有助于独立地管理各组成部分。

缺点:每使用一个桥接元素都要增加一次函数调用,这对程序的性能会有一些负面影响,还提高了系统的复杂程度。

举个栗子:汽车厂商会把同一型号的发动机放到多款车型上使用。拿奥迪为例,假如它有 V6、V8 两款发动机,那么这两款发动机会装载到奥迪轿车或奥迪SUV两种车型中。

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式

// 奥迪轿车(车型一)
class Aodi1 {
    constructor(engine) {
        this.engine = engine;
    }
}

// 轿车平台
Aodi1.prototype.platform = function() {
    console.log('aodi1 轿车平台');
}

// 加载轿车发动机
Aodi1.prototype.loadEngine = function() {
    this.engine.run();
}

// 奥迪SUV(车型二)
class Aodi2 {
    constructor(engine) {
        this.engine = engine;
    }
}

// SUV平台
Aodi2.prototype.platform = function() {
    console.log('aodi2 SUV平台');
}

// 加载SUV发动机
Aodi2.prototype.loadEngine = function() {
    this.engine.run();
}

// V6 发动机
function V6() {
    this.run = () => {
        console.log('v6发动机');
    }
}

// V8 发动机
function V8() {
    this.run = () => {
        console.log('v8发动机');
    }
}

// 搭载 V6 发动机的轿车
let car1 = new Aodi1(new V6());
// 搭载 V8 发动机的轿车
let car2 = new Aodi1(new V8());
// 搭载 V8 发动机的SUV
let suv1 = new Aodi2(new V8());

car1.platform();
car1.loadEngine();

car2.platform();
car2.loadEngine();

suv1.platform();
suv1.loadEngine();

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式


三、组合模式

组合模式在对象间形成 树形结构
组合模式中基本对象和组合对象被一致对待;
无须关系对象有多少层,调用时只需在根部进行调用;

比如我们扫描文件夹和文件夹里面的文件,它是一种树形结构,我们从根文件夹出发,扫描二级文件夹,再扫描二级文件夹里的文件…,类似于如下结构:

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式

// 文件夹
const Folder = function(folder) {
    this.folder = folder;
    this.list = [];
}

// 添加文件夹
Folder.prototype.add = function(res) {
    this.list.push(res);
}

// 扫描文件夹
Folder.prototype.scan = function() {
    console.log('扫描文件夹', this.folder);
    for (let i = 0; i < this.list.length; i++) {
        this.list[i].scan();
    }
}

// 文件
const File = function(file) {
    this.file = file;
}

// 扫描文件
File.prototype.scan = function() {
    console.log('开始扫描文件', this.file);
}

// 根文件夹
let rootFolder = new Folder("root");

// 子文件夹
let htmlFolder = new Folder("html");
let cssFolder = new Folder("css");
let jsFolder = new Folder("js");

// 文件
let html4 = new File("html4");
let html5 = new File("html5");
let css2 = new File("css2");
let css3 = new File("css3");
let es5 = new File("es5");
let es6 = new File("es6");

// 添加文件夹
rootFolder.add(htmlFolder);
rootFolder.add(cssFolder);
rootFolder.add(jsFolder);

// 添加文件
htmlFolder.add(html4);
htmlFolder.add(html5);
cssFolder.add(css2);
cssFolder.add(css3);
jsFolder.add(es5);
jsFolder.add(es6);

// 从根扫描
rootFolder.scan();

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式


🎉🎉本篇小结

本文我们了解了发布订阅模式、桥接模式、组合模式。

发布订阅模式 的发布者和订阅者不用相互知道,通过第三方实现调度,属于经过解耦合的观察者模式。

桥接模式是一种 结构型设计模式,用于把抽象化与实现化解耦,使得二者可以独立变化。

组合模式 又叫部分整体模式,是一种 结构型设计模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. 百度百科 · 软件设计模式(设计模式)
  2. 菜鸟教程 · 设计模式
  3. JavaScript设计模式 【作者:千锋教育】

JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式,设计模式,javascript,设计模式,桥接模式,组合模式文章来源地址https://www.toymoban.com/news/detail-708586.html


到了这里,关于JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之订阅发布模式

    订阅发布模式(Publish-Subscribe Pattern)是一种行之有效的解耦框架与业务逻辑的方式,也是一种常见的观察者设计模式,它被广泛应用于事件驱动架构中。 在这个模式中,发布者(或者说是主题)并不直接发送消息给订阅者,而是通过调度中心(或者叫消息代理)来传递消息

    2024年02月06日
    浏览(47)
  • 3.设计模式之后七种模式桥接装饰者组合外观享元代理模板

    1.桥接模式 bridge(抽象类的实现的子类,通过聚合间接调用接口方法 就是桥) 实现和抽象分开,使他可以独立改变 结构型设计模式 基于类的最小设计原则(增加功能,增加最少个数的类),通过封装 聚合和继承让不同类实现不同职责 图 23桥接模式原理图 图 26桥接模式传统解决手机操

    2024年02月12日
    浏览(52)
  • js设计模式——发布订阅模式

    一、概述 发布订阅模式是一种常用的设计模式,它定义了一种一对多的关系,让多个订阅者对象同时监听某一个主题对象,当主题对象发生变化时,它会通知所有订阅者对象,使它们能够自动更新 。 二、优缺点 1. 优点: 实现了发布者和订阅者之间的解耦,提高了代码的可

    2024年02月06日
    浏览(46)
  • js设计模式:发布订阅模式

    也称之为消息队列模式,或者pubsub模式 发布者发布消息(也可以理解为调用某函数),订阅者会收到消息,并且发布者可以将一些参数传递给订阅者。 是一种常用的参数传递方法,经典的pubsub.js,vue2中的$bus等都是用的这种模式。

    2024年02月19日
    浏览(53)
  • 设计模式之观察者(发布订阅)模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 观察者模式主要解决的问题: 当一个对象状态发生改变后给其他的对象通知 观察者的优点: 观察者和

    2024年02月07日
    浏览(51)
  • JavaScript 设计模式之组合模式

    在我们日常中肯呢个会将一个表单用这种模式来创建 先写一个基类,再继承该基类 首先我们创建一个基类 定义 接下来创建一个容器 注意,这里的 show 方法就是用来将所有的 dom 追加到页面上 下面创建一系列的 form 相关 item 及一些dom 使用  假使页面中存在 dom  js 效果 组合模

    2024年02月22日
    浏览(48)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(52)
  • javascript设计模式-组合

    组合模式 是一种专为创建WEB上的动态用户界面而量身定制的模式。使用它,可以用一条命令在多个对象上激发复杂或递归行为,那些复杂行为被委托给各个对象。前提是每个对象必须实现相同的接口。接口检查越严格,其稳定性越高。 可以用同样的方法处理对象的集合与其

    2024年01月21日
    浏览(42)
  • 设计模式(四) —— 观察者模式/发布订阅模式,c和c++示例代码

    往期地址: 设计模式(一)——简单工厂模式 设计模式(二)——策略模式 设计模式(三)——装饰模式 本期主题: 使用c和c++代码,讲解观察者模式、发布订阅模式 发布-订阅模式是一种行为设计模式,它允许多个对象通过事件的发布和订阅来进行通信; 在这种模式中,

    2023年04月17日
    浏览(47)
  • RabbitMQ学习——发布订阅/fanout模式 & topic模式 & rabbitmq回调确认 & 延迟队列(死信)设计

    1.rabbitmq队列方式的梳理,点对点,一对多; 2.发布订阅模式,交换机到消费者,以邮箱和手机验证码为例; 3.topic模式,根据规则决定发送给哪个队列; 4.rabbitmq回调确认,setConfirmCallback和setReturnsCallback; 5.死信队列,延迟队列,创建方法,正常—死信,设置延迟时间; 点对

    2024年02月13日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包