命令模式

.NET设计模式(17):命令模式(CommandPattern) 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠]。这就是本文要说的Command模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。[GOF《设计模式》]Command模式结构图如下:图1Command模式结构图Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。 立即下载
命令模式(Command)结构并不复杂,简单的说,就是将某些职责封装成对象,对象的激发者(Invoker)和接收者(Reciever)都不过问命令的执行过程。用这样的方式解除了激发者和接受者之间的耦合,为程序提供了更清晰的层次结构。实际运用中经常是将系统中的命令抽象成一个接口,所有的命令都是这个接口的实现,如下所示:


Command类是ICommand的实现,Command类实现了execute方法,其他命令类都是Command方法的子类。这样激发者接受者和接受者面临的环境就非常简单了:统一作为Command类型就可以处理了。

最简单的命令模式的实现代码如下:

///定义Command接口

public interface ICommand

{

void execute();

}



///实现ICommand接口

///Command类是所有命令的基类,在这里实现一些命令的共同处理过程

public abstract class Command : ICommand

{

public virtual void execute()

{

}

//实现其他的方法....

}



///实现一个具体的Command1

public class Command1 : Command

{

public void override execute()

{

//具体的处理过程

}

}



///实现一个具体的Command2

public class Command2 : Command

{

public void override execute()

{

//具体的处理过程

}

}



///实现一个具体的Command3

public class Command3 : Command

{

public void override execute()

{

//具体的处理过程

}

}


命令模式的实际应用

下面从一个系统实例看一看命令模式的应用。ReportingService是一个报表系统的一部分,是一个运行在Windows系统上的Service程序,所需要完成的功能是:每天晚上11点到凌晨2点,将数据库中的大批量的数据生成数百张报表。报表的分布较为复杂,有的要求在Web服务器上发布报表,有的要求将报表数据输出成一个文本文件,还有的要将报表保存在数据库系统中。

系统的设计运用了命令模式,其中的一部分结构如下:



程序中定义了ICommand接口,实现了多个Command类(这里只画出3个表示示例),分别执行各个报表的生成任务。Command类提供了下列接口:

分类 名称 类型 说明
属性 finished bool 表示任务是否已经进行完毕
属性 context IApplicationContext 任务执行需要的环境和资源,包括数据库连接、文件系统等等
方法 execute void 执行任务

Service的主线程每天定时将系统运行环境进行初始化,建立一个ApplicationContext类的实例(Application是一个Singlton模式的类,图中没有体现),这个类中保存了Command运行需要使用的全部资源。然后初始化一个Command对象列表,逐个执行每一个Command。这样一来,复杂的业务逻辑就从程序的主框架中分离开了,Service的主线程所需要做的全部工作就是协调资源的分配和异常的处理,还可以不断检查命令执行的状态,看看finished属性是否为真。如果执行完以后发现某些命令执行不成功,要做相应的处理。

程序采用了单元测试的开发方式,在对程序主线程进行测试的时候,使用了一个虚拟的Command实现。测试每一个Command类的时候则为每个Command实现了虚拟的ApplicationContext。这样的结构为单元测试提供了很多便利。关于提高程序的可测试性可以参见我的另一篇文章:怎样测试代码中难测试的部分。

命令模式和其他模式的结合

为了给Command的建立提供一个整洁简单的方式,Command模式经常和工厂模式(Factory)结合使用,采用一个工厂对Command对象的建立进行管理,减少命令激发者与命令对象之间的耦合程度。

在窗体程序中,Command模式还经常与组合模式(Composition)结合使用。可以在初始化窗体的时候,将画面上的菜单项、工具栏、按钮等控件与相应的Command进行组合,这样在控件点击时,调用对应的Command,即可实现对命令的处理。

在《程序员》杂志本年第10月期介绍了一个利用Command模式实现程序中Undo功能的文章。程序中为每个Command定义了“执行”和“撤销”两种操作,如下:



图中的Action就是Commamnd对象,只是名称不同,意义是一样的。Action对象存在do和undo方法,分别是“执行”和“撤销”方法。可以将执行完毕的Action对象的done属性设置为true,再将其保存在一个列表中——ActionList。在ActionList中找到最后一个done属性为true的Action,执行其undo方法,即可实现“撤销”的操作。

命令类的序列化

如果将Command基类及其每一个子类都进行序列化,可以实现更多的强大的功能。程序执行过程中,如果发生异常,比如网络发生中断、文件丢失等异常,可以将没有执行完毕的Command序列化保存下来。等待可以执行的时候再将这些对象重新加载,命令可以继续执行。甚至用户已经重新启动了计算机,命令也可以继续执行。Command对象的序列化也为分布式的操作提供了便利。在网络环境中,可以在某处建立一个Command对象,将其序列化后传输到网络上另一台计算机上进行执行。这种情况下不要忘记异常类的序列化,如果自己定义了Exception的子类,也要将其进行序列化,以便在网络环境中捕捉和处理Command执行时发生的异常。Microsoft网站上有一篇文章介绍.NET中对象的序列化,详细的介绍了对象序列化的概念。
TriCore架构-基于TC397的启动流程 TC397芯片的启动流程分为三个关键阶段:固件启动(BootFirmware)、Bootloader引导和应用程序启动。BootFirmware作为硬件信任根,包含SSW基础初始化、CHSW自检和BSL应急刷写通道。Bootloader承担安全验证和程序引导功能,支持双分区(AB-SWAP)和双引导方案(PBL/SBL)。安全启动通过校验机制确保软件完整性,提供三种可选技术方案。应用程序启动阶段实现软件双分区管理,支持SOTA更新。整个流程体现了汽车电子系统的安全设计理念,通过硬件级保护与软件验证相结合确保 阅读详情

相关推荐

ROS 2 Slam Toolbox实战:从零跑通2D激光建图

SLAM(同步定位与地图构建)是移动机器人实现自主导航的基础技术,其核心在于通过传感器数据实时估计位姿并构建环境栅格地图。slam_toolbox作为ROS 2 Humble及后续LTS版本官方主推的2D SLAM后端,采用图优化+闭环检测架构,兼顾实时性、鲁棒性与工程可维护性。相比cartographer和hector_slam,它原生支持ROS 2、参数精简、诊断友好,特别适合硬件资源有限、缺乏IMU或深度相机的差速机器人平台。本文聚焦真实部署场景,覆盖RPLIDAR等常见2D激光雷达与TurtleBo

weixin_30596165的博客 358

命令模式(Command Pattern)-PHP示例

命令模式(Command Pattern) 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太

patriot_28的博客 269

SAP采购含税价转换的底层逻辑解析:ABAP例程如何实现价税分离计算

本文深入解析SAP系统中采购含税价与不含税价的转换机制,重点介绍VOFM例程和ABAP代码实现价税分离计算的方法。通过详细讲解数学原理、税率体系及SAP定价引擎架构,为开发人员提供完整的解决方案,帮助提升采购业务中的价格处理效率和准确性。

weixin_29237635的博客 450

设计模式第19讲——命令模式(Command)

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0 UML类图 5.1 抽象命令(Command)——Command5.2接收者(Receiver)——Chef5.3具体命令(Concrete Command)——OrderCommand六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

2.1 量子精密测量:SERF原子陀螺仪中的核自旋-电子自旋强耦合机制

本文深入解析了SERF原子陀螺仪中核自旋-电子自旋强耦合机制的核心原理与应用。通过量子精密测量技术,SERF陀螺仪实现了超高精度的惯性导航,其独特的磁场自补偿和拉莫尔进动特性使其在弱磁场环境下表现出色。文章还探讨了关键技术突破和前沿进展,展示了量子精密测量在惯性导航领域的巨大潜力。

kotlin6android的博客 211

VS2017配置PCL1.9.1 for win10(超详细)

准备工作 VS2017 自行下载 PCL1.9.1 点击链接跳转Github下载,根据自己的环境选择 win64或win32,作者下载的是:PCL-1.9.1-AllInOne-msvc2017-win64.exepcl-1.9.1-pdb-msvc2017-win64.zip 安装PCL 双击点开PCL-1.9.1-AllInOne-msvc2017-win64.exe,选择Add PCL to the system PATH for all users, 更改安装路径,E:\Progra

malapoa的博客 1146

.NET 设计模式—命令模式(Command Pattern)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

weixin_38747097的博客 600

全网最详细教程,手把书教你使用YOLOv10训练自己的数据集和推理(附YOLOv10网络结构图)

YOLOv10,由清华大学多媒体智能组只开发,是一款亳秒级实时端到端目标检测的开源模型。该模型在保持性能不变的情况下,与YOLOv9相比,延迟减少了46%,参数减少了25%,非常适合需要快速检测物体的应用,如实时视频分析、自动驾驶和智能医疗等领域。这些改进使得YOLOv10在实时物体检测领域达到了新的技术水平。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

设计模式之【命令模式】,方法调用的花式玩法

命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令是怎样被接受,怎样被操作以及是否被执行等。命令模式属于行为型模式。原文:将一个请求封装成医德对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,因为这样的实现简单明了。

秃了也弱了 3751

Qt代码-军用仿真系统基础框架

ui->mapClickLabel->setText(QString("地图点击:(%.1f, %.1f)米").arg(worldPos.x()).arg(worldPos.y()));emit simulationEvent(QString("添加实体: %1 (ID: %2)").arg(attr.name).arg(entity.id()));// 像素坐标→世界坐标(米)

寒寒豆豆软件公司的博客 169

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9615

设计模式-命令模式(Command)

命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点是可以将请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

miaoyl的博客 2946

深度学习驱动的股票波动率预测:LSTM和Transformer模型的实战解析

股票市场的波动率一直是金融领域关注的焦点之一。波动率预测对于风险管理、期权定价和资产配置至关重要。深度学习模型,如长短时记忆网络(LSTM)和Transformer,已经在时间序列数据分析领域取得了显著的成就。本博客将向您展示如何使用这两种深度学习模型来进行股票波动率预测,提供清晰的思路和相应的Python代码,以帮助您理解和应用这一重要任务。

斌擎科技 974

命令模式(CommandPattern)

定义 将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(Transaction)模式。 结构图 角色与理解 命令模式包含如下角色: Command(抽象命令类):所有具体命令类的父类,一般定义为抽象类或者接口,声明执行请求的execute()方法等。 Concrete Command(具体命令类):继承抽象命令类,持有接收者的引用,在execute()等方法中调用接收者的方法已

码农架构 504

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CommandPattern-命令模式

角色: Command: 定义命令的统一接口 ConcreteCommand:Command接口的实现者,用来执行具体的命令 Receiver:命令的实际执行者 Invoker:命令的请求者,这个角色用来对各个命令进行控制 使用场景: 1 命令的发送者和命令执行者有不同的生命周期,命令发送了并不是立即执行 2 命令模式是对功能方法的抽象,不是对对象的抽象 3 命令模式是将功能提升到对象来操作,以便...

其实我也没有太多期盼,毕竟一生太短,少有圆满 229

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

您的设计模式——命令模式【Command Pattern 】

今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思, 但是更深化了,用模式来描述真是是世界的命令情况。正在看这本书的你,我猜测分为两类:已经工作的和没有 工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参加工作,你肯定会待在项目组,那 今天我们就以项目组为例子来讲述命令模式。 我是我们部门的项目经理,就是一个项目的头,在中国做项目

422

设计模式之命令模式

说实话这个模式挺令人纠结的,但从这个模式的定义上来看,有点让人摸不到什么头脑,而且查看资料以后会发现还是有点稀里糊涂的,说懂了吧也很简单,也不懂吧也有不懂的理由,于是查阅手头的各种书籍,在此写下心得体会,算是加深一下印象。 命令模式的定义:将请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,以及支持可撤销和恢复的功能。 从定义上来看着实令人一脸懵逼,在这里描述一下博主个人的理解:

菜鸟博客 2万+

Unity 命令模式(实例详解)

在Unity中使用命令模式(Command Pattern)是一种常见的设计模式,用于实现对游戏或应用中一系列动作的记录、撤销和重做操作。接口以确保它们都能执行和撤销操作。在实际项目中,命令管理器会存储这些命令并根据需要执行撤销/重做功能。这些示例展示了如何定义不同的命令,并且每个命令都实现了。

qqrrjj2011的博客 1980

命令模式【Command Pattern 】

幸福就是回来看书,看自己想看的书。   博客地址  http://blog.youkuaiyun.com/ftx2540993425   下面横线以上内容是借鉴别人的,为了表达对作者的敬意,不做不恰当的修改,我个人的总结在后面。好的东西 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思, 但是更深化了,用模式来描述真是是世界的命令情况。正在

菜鸟的飞翔 478

软件设计模式——命令模式

一、定义 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 二、作用 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行...

JingHaiRoad Coder 448

命令模式CommandPattern

概念 命令模式:把一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦

chengmaoning的专栏 627

命令模式(Command Pattern)

    命令模式属于对象的行为模式。命令模式又称为行动模式或交易模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。     命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操...

qq_26880671的博客 206

设计模式命令模式(CommandPattern)

核心模块:抽象命令类、具体命令类、命令接收者、调用者 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:不知道请求的接收者,不知道请求的操作,主要封装不同的命令,可以使用这种松耦合的方式; 优点:低耦合度,新的命令很容易添加到系统,支持undo和redo操作,和命令队列; 缺点:如果命令过多导

didiao11300的专栏 268
上一篇: Net中的设计模式——Iterator模式
下一篇: 观察者模式
playsation10
博客等级 码龄22年 0粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值