命令模式是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化、对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式的目的是将发出命令的责任和执行命令的责任分割开,使得请求的一方(调用者)不必知道接收请求的一方(接收者)的接口,更不必知道请求是如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。


一、命令模式的基本概念

命令模式包含以下几个关键角色:

  1. 命令接口(Command):声明了一个执行操作的接口,所有具体命令类都需要实现这个接口。它通常包含一个execute()方法,用于执行命令。
  2. 具体命令(Concrete Command):实现了命令接口,将接收者对象绑定到其中,并定义了具体的执行行为。当调用execute()方法时,它会调用接收者的相关方法来执行操作。
  3. 调用者(Invoker):持有命令对象,并可以在某个时刻调用命令对象的execute()方法。调用者不需要知道具体命令的实现细节,只需要知道它持有的是一个命令对象。
  4. 接收者(Receiver):知道如何执行与命令相关的操作。它通常是某个类的实例,该类具有执行命令所需的具体方法。
  5. 客户端(Client):创建具体的命令对象,并设置命令对象的接收者。客户端也可以将命令对象传递给调用者,由调用者在某个时刻执行命令。

二、命令模式的工作原理

命令模式的工作原理相对简单而强大:

  • 客户端创建具体的命令对象,并设置命令对象的接收者。
  • 客户端将命令对象传递给调用者。
  • 调用者在某个时刻调用命令对象的execute()方法。
  • 命令对象调用接收者的相关方法来执行操作。

三、命令模式的优点

  1. 解耦:命令模式将发出命令的责任和执行命令的责任分割开,使得请求的一方(调用者)和接收请求的一方(接收者)之间解耦。
  2. 灵活性:通过引入命令对象,可以很容易地添加新的命令,而无需修改现有的代码。
  3. 可扩展性:命令模式支持命令的排队、记录日志、撤销等操作,这些都可以通过扩展命令接口或添加新的命令类来实现。
  4. 易于实现撤销操作:由于命令对象保存了执行前的状态,因此可以很容易地实现撤销操作。

四、实例讲解

为了更好地理解命令模式,以下通过一个实例来进行讲解。

假设我们有一个简单的遥控器系统,可以控制电视(TV)的打开和关闭操作。我们可以使用命令模式来实现这个系统。

首先,我们定义一个Command接口,它包含一个execute()方法:

java复制代码
public interface Command {
void execute();
}

然后,我们创建两个具体的命令类:OpenTvCommandCloseTvCommand,它们实现了Command接口:

java复制代码
public class OpenTvCommand implements Command {
private TVReceiver tvReceiver;
public OpenTvCommand(TVReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
tvReceiver.on();
}
}
public class CloseTvCommand implements Command {
private TVReceiver tvReceiver;
public CloseTvCommand(TVReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
tvReceiver.off();
}
}

接下来,我们创建一个TVReceiver类,它包含打开和关闭电视的方法:

java复制代码
public class TVReceiver {
public void on() {
System.out.println("TV is on");
}
public void off() {
System.out.println("TV is off");
}
}

然后,我们创建一个RemoteControl类,它作为调用者,持有命令对象,并可以在某个时刻调用命令对象的execute()方法:

java复制代码
import java.util.ArrayList;
import java.util.List;
public class RemoteControl {
private Command onCommand;
private Command offCommand;
private List<Command> commandList = new ArrayList<>();
public void setOnCommand(Command onCommand) {
this.onCommand = onCommand;
}
public void setOffCommand(Command offCommand) {
this.offCommand = offCommand;
}
public void pressOnButton() {
onCommand.execute();
}
public void pressOffButton() {
offCommand.execute();
}
public void addCommand(Command command) {
commandList.add(command);
}
public void executeAllCommands() {
for (Command command : commandList) {
command.execute();
}
}
}

最后,我们在客户端代码中创建具体的命令对象,并设置命令对象的接收者,然后将命令对象传递给遥控器对象:

java复制代码
public class Client {
public static void main(String[] args) {
TVReceiver tvReceiver = new TVReceiver();
Command openTvCommand = new OpenTvCommand(tvReceiver);
Command closeTvCommand = new CloseTvCommand(tvReceiver);
RemoteControl remoteControl = new RemoteControl();
remoteControl.setOnCommand(openTvCommand);
remoteControl.setOffCommand(closeTvCommand);
remoteControl.pressOnButton(); // 输出: TV is on
remoteControl.pressOffButton(); // 输出: TV is off
// 添加命令到命令列表并执行
remoteControl.addCommand(new OpenTvCommand(tvReceiver));
remoteControl.addCommand(new CloseTvCommand(tvReceiver));
remoteControl.executeAllCommands(); // 输出: TV is on, TV is off
}
}

通过这个例子,我们可以看到命令模式如何允许我们在不修改现有类的情况下,动态地为对象添加新的命令。这种灵活性使得命令模式在需要扩展功能但又不希望修改现有代码的场景中非常有用。同时,命令模式还支持命令的排队、记录日志、撤销等操作,这些都可以通过扩展命令接口或添加新的命令类来实现。

 

扫描下方二维码,一个老毕登免费为你解答更多软件开发疑问!

华为鸿蒙生态发展演讲:从操作系统到数字底座的进化论

【导语】在万物互联的智能时代,操作系统是数字世界的“地基”,而华为鸿蒙生态正以惊人的速度重构这一地基的形态。在2025华为开发者大会(HDC)上,华为消费者业务CEO余承东宣布:“鸿蒙生态已跨越1.5亿设备激活量,开发者数量突破380万,成为全球第三大移动应用生态。”这场演讲不仅揭示了鸿蒙的成长密码,更抛出了一个关键命题:当操作系统进化为数字底座,开发者将如何抓住下一波红利?一、数据透视:鸿蒙生态

百度发布多模态AI程序员Zulu:代码革命还是程序员“饭碗”终结者?

【导语】“让AI写代码,人类程序员该何去何从?”在2025百度AI开发者大会上,百度CTO王海峰抛出的这个问题,随着多模态AI程序员Zulu的发布被推向风口浪尖。这款号称“能听、能看、能思考”的代码生成工具,在内部测试中已实现82%的函数级代码自动生成,开发效率提升4倍。当AI开始入侵程序员最后的“技术护城河”,一场关于效率与饭碗的争论正在硅谷与中关村同步上演。一、技术解密:Zulu的“三头六臂”

苹果管理层大换血:库克押注AI机器人,能否再造“iPhone时刻”?

【导语】“当全球都在追赶Vision Pro时,苹果已经悄悄调转船头。”北京时间2025年4月29日,苹果官网悄然更新高管团队名单:原机器学习与AI战略高级副总裁John Giannandrea晋升为首席运营官(COO),机器人技术负责人Kevin Lynch进入执行董事会。这场被外媒称为“苹果20年来最大规模管理层调整”的变革,正式宣告库克将宝押向AI与机器人赛道。在这场豪赌背后,是苹果营收增速

腾讯云Craft智能体发布:AI开发进入“傻瓜模式”,中小企业迎来技术平权时代

【导语】“以后写代码就像发朋友圈一样简单。”在2025腾讯云峰会上,腾讯云副总裁吴运声抛出的这句话,随着全链路AI开发平台“Craft智能体”的发布引发行业震荡。这款被内部称为“AI开发界的美图秀秀”的产品,凭借“零代码搭建AI应用”“模块化自由组合”“按需付费”三大核心卖点,直击中小企业AI开发成本高、周期长、人才缺的行业痛点。当AI技术从实验室走向田间地头,Craft智能体能否成为企业智能化的

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部