命令模式:将请求封装为对象


命令模式:将请求封装为对象

文章插图
什么是命令模式?命令模式是一种行为型设计模式 , 它将请求或操作封装成独立的命令对象 。这些命令对象包括了执行操作所需的所有信息,例如操作方法、参数和接收者 。
命令模式允许您将命令发送者(客户端)和命令执行者(接收者)解耦,使得发送者无需知道接收者的具体类别 。
在命令模式中,通常包含以下关键角色:
  1. 命令(Command):声明了执行操作的接口 , 通常包括一个 execute 方法 。
  2. 具体命令(Concrete Command):实现了命令接口,包含了实际的操作逻辑 。每个具体命令对象都与一个接收者相关联 。
  3. 接收者(Receiver):执行命令实际操作的对象 。
  4. 调用者(Invoker):负责调用命令对象来执行请求 。
  5. 客户端(Client):创建命令对象并设置其接收者,然后将命令对象传递给调用者 。
为什么需要命令模式?命令模式有以下几个优点:
  1. 解耦:命令模式可以将发送者和接收者解耦,发送者无需知道接收者的具体实现 , 从而提高了系统的灵活性 。
  2. 可扩展性:您可以轻松地添加新的命令类 , 而无需修改已有的代码 。
  3. 撤销操作:命令对象通常会保存操作的状态,从而支持撤销操作 。
  4. 日志记录和事务管理:您可以使用命令模式来记录所有执行的命令,以便进行事务管理或撤销 。
命令模式的实现让我们通过一个简单的示例来演示命令模式的实现 。假设我们正在构建一个遥控器应用,用户可以通过遥控器执行不同的操作 , 例如打开电视、切换频道和调整音量 。首先,我们定义一个命令接口 Command,它包括了一个 execute 方法: public interface Command {
void execute();
}
 接下来,我们创建具体的命令类,例如 TurnOnCommandChangeChannelCommand 和 AdjustVolumeCommand,它们实现了 Command 接口,并分别执行相应的操作 。 public class TurnOnCommand implements Command {
private Television television;
public TurnOnCommand(Television television) {
this.television = television;
}
public void execute() {
television.turnOn();
}
}
// 类似地实现 ChangeChannelCommand 和 AdjustVolumeCommand
 然后,我们创建接收者类 Television , 它包含了实际的操作逻辑: public class Television {
public void turnOn() {
System.out.println("电视已打开");
}
public void changeChannel() {
System.out.println("切换频道");
}
public void adjustVolume() {
System.out.println("调整音量");
}
}
 最后,我们创建调用者类 RemoteControl,它接收并执行命令: public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
 客户端代码如下: public class Client {
public static void mAIn(String[] args) {
Television television = new Television();
Command turnOnCommand = new TurnOnCommand(television);
Command changeChannelCommand = new ChangeChannelCommand(television);
Command adjustVolumeCommand = new AdjustVolumeCommand(television);
RemoteControl remoteControl = new RemoteControl();
remoteControl.setCommand(turnOnCommand);
remoteControl.pressButton();
remoteControl.setCommand(changeChannelCommand);
remoteControl.pressButton();
remoteControl.setCommand(adjustVolumeCommand);
remoteControl.pressButton();
}
}
 这个示例中 , 我们将不同的操作(打开电视、切换频道、调整音量)封装成了命令对象 , 通过遥控器执行这些命令,而不需要直接调用接收者的方法 。宏命令宏命令是一种命令模式的扩展,它允许您将多个命令组合成一个更大的命令 。宏命令本身也是一个命令,可以执行一系列子命令 。这对于执行复杂的操作或者创建多级撤销机制非常有用 。让我们通过一个示例来了解宏命令 。假设我们有一个文本编辑器 , 需要实现一个宏命令来执行以下操作:
  1. 打开文件
  2. 编辑文件
  3. 保存文件
首先,我们定义一个宏命令接口 


推荐阅读