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

命令模式,命令 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.lryc.cn/news/184734.html

相关文章:

  • jira 浏览器插件在问题列表页快速编辑问题标题
  • 2020架构真题(四十六)
  • 软件工程与计算总结(五)软件需求基础
  • 数学建模预测模型MATLAB代码大合集及皮尔逊相关性分析(无需调试、开源)
  • 泛型擦除是什么?
  • 阿里云轻量应用服务器有月流量限制吗?
  • mysql面试题25:数据库自增主键可能会遇到什么问题?应该怎么解决呢?
  • 学习css 伪类:has
  • 矩阵的相似性度量的常用方法
  • Java之TCP,UDP综合小练习一
  • Docker 日志管理 - ELK
  • windows系统下利用python对指定文件夹下面的所有文件的创建时间进行修改
  • 线性表的链式表示——单链表;头插,尾插,按值查找,按序号查找,插入,删除;
  • 【Spring Cloud系统】- Zookeer特性与使用场景
  • 最新AI智能创作系统源码SparkAi系统V2.6.3/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型
  • R | R包默认安装路径的查看及修改
  • 将conda虚拟环境打包并集成到singularity镜像中
  • Android Studio 是如何和我们的手机共享剪贴板的
  • 大数据面试题:Spark和MapReduce之间的区别?各自优缺点?
  • 【开发篇】十八、SpringBoot整合ActiveMQ
  • QTcpSocket 接收数据实时性问题
  • 前端el-select 单选和多选
  • 【MySQL】Linux 中 MySQL 环境的安装与卸载
  • 机器学习算法分类
  • Mysql bin-log日志恢复数据与物理备份-xtrabackup
  • JAVA 学习笔记 2年经验
  • 网络安全--安全认证、IPSEC技术
  • Mysql——创建数据库,对表的创建及字段定义、数据录入、字段增加及删除、重命名表。
  • 第1篇 目标检测概述 —(4)目标检测评价指标
  • 前端和后端是Web开发中的两个不同的领域,你更倾向于哪一种?