当前位置: 首页 > news >正文

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

组合模式

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

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

// 组合模式
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.mrgr.cn/news/8617.html

相关文章:

  • Oracle 同义词SYNONYM 的实战使用
  • fpga图像处理实战-图像膨胀
  • 通过FileReader API获取上传音频的长度
  • 在编程学习的道路上,面对Bug和复杂算法时,我们常常会感到挫折和困惑。以下是一些克服这些挑战的有效方法:
  • Gstreamer-OpenCV的RTSP服务搭建以及推拉流实现
  • C++STL之list的使用详解
  • 常见虚拟现实硬件设备及特点
  • Vue2的16种传参通信方式
  • 选择合适的待办事项软件:用户体验报告
  • 并行 parallel DOP 受 Resource Manager 限制
  • jmespath用法总结
  • Spark MLlib 特征工程系列—特征转换PCA(Principal Component Analysis)
  • 8.Java基础概念-方法
  • 依赖倒置原则
  • Redis | 非关系型数据库Redis的初步认识
  • 刷题DAY17
  • 微服务 - 分布式锁的实现与处理策略
  • Telnet不止于端口测试:探索经典工具的多样化应用
  • 学习大数据DAY42 hive 分桶表
  • liteflow的组件编排