命令模式,命令 Command 类对象的设计(设计模式与开发实践 P9)

文章目录

    • 命令
    • 举例
    • 撤销
    • C# 例子

命令

命令模式 Command 指的是一个 执行某些特定事情的指令

应用场景:有时需要向某些对象发送请求,但并不知道请求的接受者是谁,也不知道被请求的操作是什么。这时候命令模式就负责使发送者和接受者之间解耦

命令模式把请求封装成 Command 对象,这个对象可以在程序中四处传递,接受者不需要知道发送者是谁,解开了调用者和接受者之间的耦合

举例

假如我们正在编写一个 UI 界面,由于项目复杂,我们让一个程序员负责绘制按钮,另外的程序员负责编写点击按钮后的具体行为,这些行为都被封装在命令对象里~

让我们创建一个命令对象,用来控制 电视 的行为:

const TVCommand = {// 打开电视turnOn: function() {console.log("电视已打开");},// 关闭电视turnOff: function() {console.log("电视已关闭");},// 切换频道changeChannel: function(channel) {console.log("频道已切换至 " + channel);}
};

接下来绘制 UI 时,给按钮加上发送指令的功能(这里也是可以再次进行抽象和解耦的)

const turnOnButton = document.getElementById("turnOnButton");
const turnOffButton = document.getElementById("turnOffButton");
const changeChannelButton = document.getElementById("changeChannelButton");turnOnButton.addEventListener("click", function() {TVCommand.turnOn();
});turnOffButton.addEventListener("click", function() {TVCommand.turnOff();
});changeChannelButton.addEventListener("click", function() {const channel = document.getElementById("channelInput").value;TVCommand.changeChannel(channel);
});

撤销

命令模式还有一个好处就是可以进行命令的撤销,实现方法根据场景设计,这里就不给出例子了

C# 例子

如同过去的几个章节,这里给出 C# 版本的例子!

using System;// 命令接口
public interface ICommand
{void Execute();
}// 具体命令
public class SimpleCommand : ICommand
{private string _message;public SimpleCommand(string message){_message = message;}public void Execute(){Console.WriteLine(_message);}
}// 命令执行者
public class CommandExecutor
{public void ExecuteCommand(ICommand command){command.Execute();}
}class Program
{static void Main(string[] args){// 创建命令和命令执行者ICommand command = new SimpleCommand("Hello, World!");CommandExecutor executor = new CommandExecutor();// 执行命令executor.ExecuteCommand(command);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试真题【服务器能耗统计】

1、题目描述 【服务器能耗统计】 服务器有三种运行状态:空载、单任务、多任务,每个时间片的能耗的分别为1、3、4; 每个任务由起始时间片和结束时间片定义运行时间; 如果一个时间片只有一个任务需要执行,则服务器处于单任务状志; 如果一个时间片有多个任务需要执行,则服务器处于…

Atcoder Regular Contest 165

B. Sliding Window Sort 2 被题目名里的滑动窗口误导了,于是卡 B 40min /fn Description 给定长度为 \(n\) 的排列 \(P\) 和一个整数 \(K\)。一次操作定义为选择一个长度为 \(K\) 的区间,对原排列的这段区间升序排序,其余位置不变。 你要执行…

九大装修收纳空间的设计,收藏备用!福州中宅装饰,福州装修

如果房子面积不大,收纳设计就显得非常重要。其实装修房子中很多地方都可以做收纳,九大空间每一处都可以放下你的东西,让你摆脱收纳烦恼。 收纳空间少的话,装修完后住久了怕会乱成一窝,因此装修的时候,收纳…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

3D模型格式转换工具HOOPS Exchange助力Halocline开发VR

挑战: 支持客户群使用各种CAD系统和CAD文件格式。快速准确的加载可视化硬件数据。提供访问模型详细信息,同时确保高帧频性能。 结果: 确保支持标准文件格式和来自领先工程软件包的CAD数据。 通过查看简化模型或根据需要访问高层次的细节&am…

面试题20231008

前端 2023年前端面试题汇总-CSDN博客 后端 1.Java基础 容器、线程等等 a.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Envir…

Flutter安卓混淆的相关问题

当你执行 build apk 后,flutter会默认进行混淆,若你的应用中引用了第三方的sdk,在debug模式下没问题,但在release下可能就会出现各种各样的问题,找不到某个类,或者某个功能无法使用,甚至直接崩溃…

【多线程案例】设计模式-单例模式

1.单例模式 什么是单例模式? 所谓单例,即单个实例。通过编码技巧约定某个类只能有唯一一个实例对象,并且提前在类里面创建好一个实例对象,把构造方法私有化,再对外提供获取这个实例对象的方法,&#xff0…

嵌入式养成计划-31-网络编程----TCP的并发服务器模型------IO模型--IO多路复用

六十七、 TCP的并发服务器模型 67.1 循环服务器模型 一次只能处理一个客户端,当上一个客户端退出后,才能处理下一个客户端缺点:无法同时处理多个客户端 代码模型 sfd socket(); bind(); listen(); while(1){newfd accept();while(1){re…

vue-3

一、文章内容概括 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好&#xff09…

数据结构和算法笔记1:滑动窗口

在一些数组或者字符串我们需要遍历子序列,可能要用到两个指针(我们称为起始指针和终止指针)进行双层遍历,内层终止指针满足条件时跳出内层循环,然后起始指针前进,回溯终止指针到起始指针,以此继…

取消激光雷达/不升级Orin,小鹏P5改款背后的行业「痛点」

9月25日,小鹏汽车正式发布了旗下改款车型—2024款小鹏P5(15.69-17.49万元)。车型精简、降本增效(减配)成为新亮点。 在配置变化方面,智驾成为牺牲品。其中,高配Pro车型继续保留英伟达Xavier&…

CCC、ICCE和ICCOA数字钥匙协议

文章目录 一、CCC二、ICCE三、ICCOA四、比较 一、CCC CCC(Car Connectivity Consortium)车联网联盟是一个致力于制定智能手机到汽车连接解决方案标准的全球跨行业组织。2021年7月CCC将UWB定义为第三代数字钥匙的核心技术,并发布CCC R3&#…

如何领取京东优惠券用微信支付还是用支付宝支付购买商品?

京东用微信支付还是用支付宝支付? 京东商城购物不支持支付宝支付,现京东商城支持的支付方式包括:京东支付、银行卡、信用卡、微信支付、云闪付等; 京东如何领取优惠券用微信支付购物? 1、打开京东APP,挑选…

存档&改造【04】二维码操作入口设置细节自动刷新设置后的交互式网格

因为数据库中没有数据无法查看设置效果,于是自己创建了个测试数据表,用来给demo测试 -- 二维码操作入口设置 create table JM_QR_CODE(QR_CODE_ID NUMBER generated as identity primary key,SYSTEM_ID NUMBER(20) not null,IS_ENAB…

安装torchtext遇到的坑及解决办法

刚开始秉着需要什么就pip install什么的原则直接pip install torchtext,结果: 把我这个环境打乱了,自作主张的删掉之前的很多包重新安装了其他版本的包而不是自适应的安装当前torch所对应的torchtext。因为这个环境比较重要也用在其他的工程…

【前端设计模式】之责任链模式

引言 在前端开发中,我们经常需要处理复杂的请求流程,例如事件处理、数据验证等。这时候,职责链模式就能派上用场了。职责链模式允许我们将请求发送者和接收者解耦,并将请求沿着一个链条依次传递下去,直到有一个接收者…

(C++)引用的用法总结

引用&#xff08;reference&#xff09;是C极为重要的一部分&#xff0c;本文对其用法进行简单总结。 1. 引用的基本用法 引用的关键字为&&#xff0c;表示取地址的意思&#xff0c;引用变量定义如下&#xff1a; int m 1; int &n m; //定义 cout<<"n:…

【FreeRTOS】【STM32】01从零开始的freertos之旅 浏览源码下的文件夹

基于野火以及正点原子 在打开正点原子的资料pdf时&#xff0c;我遇到了pdf无法复制粘贴的问题&#xff0c;这里有个pdf解锁文字复制功能的网址&#xff0c;mark一下。超级pdf 参考资料《STM32F429FreeRTOS开发手册_V1.2》 官方资料 FreeRTOS 的源码和相应的官方书籍均可从官…

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…