【设计模式】组合模式和(宏)命令模式

embedded/2024/9/24 20:26:28/

组合模式

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

它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

// 组合模式
const Folder = function(folderName) {this.folderName = folderName;this.files = [];
};Folder.prototype.add = function(file) {this.files.push(file);
};Folder.prototype.scan = function() {console.log(`开始扫描文件夹:${this.folderName}`);for (let i = 0; i < this.files.length; i++) {this.files[i].scan();}
};const File = function(fileName) {this.fileName = fileName;
};File.prototype.add = function() {throw new Error('文件下不能添加文件');
};File.prototype.scan = function () {console.log(`开始扫描文件:${this.fileName}`);
}// 测试
const folder = new Folder('文件夹');
const file1 = new File('文件1');
const file2 = new File('文件2');
folder.add(file1);
folder.add(file2);
folder.scan();
/*
开始扫描文件夹:文件夹
开始扫描文件:文件1
开始扫描文件:文件2*/

这里是使用了 扫描文件的示例,还有一个应用场景是 动态声明 menu 菜单栏。

命令模式

有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。需要一
种松耦合的方式来设计程序,使得发送者和接收者能够消除彼此,之间的耦合关系。

命令模式由三种角色构成:

  1. 发布者invoker(发出命令,调用命令对象,不知道如何执行与谁执行);
  2. 接收者receiver(提供对应接口处理请求,不知道谁发起请求),
  3. 命令对象command(接收命令,调用接收者对应接口处理发布者的请求)
// 命令模式
class Receiver {execute() {console.log('接收者执行命令');}
}
class Command {constructor(receiver) {this.receiver = receiver;}execute() {console.log('命令对象->接收者->对应接口执行');this.receiver.execute();}
}
class Invoker {constructor(command) {this.command = command;}execute() {console.log('调用者执行命令');this.command.execute();}
}/*** 调用者执行命令* 命令对象->接收者->对应接口执行* 接收者执行命令*/
const receiver = new Receiver();
const command = new Command(receiver);
const invoker = new Invoker(command);
invoker.execute();

命令模式

// 宏命令模式
const MacroCommand = function () {return {commandsList: [],add: function (command) {this.commandsList.push(command);},execute: function () {for (let item of this.commandsList) {item.execute();}}}
}const closeDoorCommand = {execute: function () {console.log('关门');}
}const openPcCommand = {execute: function () {console.log('开电脑');}
}const openQQCommand = {execute: function () {console.log('登录QQ');}
}const macroCommand = MacroCommand();
macroCommand.add(closeDoorCommand);
macroCommand.add(openPcCommand);
macroCommand.add(openQQCommand);
macroCommand.execute();

http://www.ppmy.cn/embedded/100832.html

相关文章

[C语言]一、C语言基础(函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中&#xff0c;每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码&#xff0c;在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码&#xff0c;这样程序会变得很臃肿&#xff…

Java二十三种设计模式-解释器模式(23/23)

本文深入探讨了解释器模式&#xff0c;这是一种行为设计模式&#xff0c;用于构建和解释执行自定义语言&#xff0c;提供了实现方法、优点、缺点、与其他模式的比较、最佳实践和替代方案的全面分析&#xff0c;帮助开发者在实际应用中做出明智的设计选择。 解释器模式&#xff…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【HuggingFace Transformers】BertModel源码解析

BertModel源码解析 1. BertModel 介绍2. BertModel 源码逐行注释 1. BertModel 介绍 BertModel 是 transformers 库中的核心模型之一&#xff0c;它实现了 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型的架构。BERT 是基于 Trans…

【图文并茂】ant design pro 如何给后端发送 json web token - 请求拦截器的使用

上一节有讲过 【图文并茂】ant design pro 如何对接后端个人信息接口 还差一个东西&#xff0c;去获取个人信息的时候&#xff0c;是要发送 token 的&#xff0c;不然会报 403. 就是说在你登录之后才去获得个人信息。这样后端才能知道是谁的信息。 token 就代码了某个人。 …

ThreeJs学习-层级模型

ThreeJs所有的模型就是一个树结构 Group层级模型 //创建两个网格模型mesh1、mesh2 const geometry new THREE.BoxGeometry(20, 20, 20); const material new THREE.MeshLambertMaterial({color: 0x00ffff}); const group new THREE.Group(); const mesh1 new THREE.Mesh(ge…

Spring Boot 集成 JdbcTemplate(盘它!)

文章目录 Spring Boot 集成 JdbcTemplate基本介绍JdbcTemplate 概念JdbcTemplate 优势JdbcTemplate 应用场景NamedParameterJdbcTemplate 概念 准备工作项目环境配置Spring Boot版本选择Maven 依赖配置 数据库配置实体类与数据库表映射创建实体类数据库表的设计与创建 JdbcTemp…

分布式互斥锁优化数据库压力:从基础到高级优化

分布式互斥锁优化数据库压力&#xff1a;从基础到高级优化 在高并发系统中&#xff0c;缓存击穿是一个棘手的问题。为了防止多个请求同时穿透缓存访问数据库&#xff0c;分布式锁成为一种有效的解决方案。然而&#xff0c;随着系统复杂度和并发量的增加&#xff0c;简单的锁机…