找回密码
 立即注册
首页 业界区 业界 命令模式

命令模式

语樊偿 2025-6-6 14:11:06
命令(Command)模式属于行为型模式的一种。命令模式把请求或者命令封装成一个对象,从而让我们可以使用不同的请求、队列或日志请求、以及支持可撤销的操作等功能。
命令模式的核心思想是将请求发送者与请求接收者解耦,使得发送者不需要知道请求的具体细节。
实际应用中的场景,比如GUI 系统中的菜单操作(复制、粘贴、撤销等)、事务处理、多线程和异步任务调度等。
在真实生活中,比如你去饭店点菜,服务员会将你点的菜都写在单子上,然后将单子送到厨房,大厨师根据单子做出你点的菜,这个单子其实就是一个命令。
命令模式通常有以下组成部分: 

  • Command(命令接口/抽象类):定义一个执行命令的接口(通常是一个方法,如 execute() ),让所有的具体命令类去实现,execute() 用于执行某个操作。
  • ConcreteCommand(具体命令):实现 Command 接口,并且将请求调用的具体操作封装在 execute() 方法中,每个具体命令类对应一个具体的请求或动作。具体命令对象会持有对接收者(Receiver)的引用。
  • Receiver(接收者):知道如何执行与请求相关的操作,承担具体的业务逻辑,该角色通常是执行真正的操作或任务的类。
  • Invoker(调用者):负责调用命令对象来执行请求,持有命令对象的引用,并在需要的时候请求执行命令。一般情况下,调用者不会知道命令对象内部具体做了什么。
  • Client(客户端):客户端负责创建命令对象,并设定命令的接收者。客户端会把这些命令对象设置到调用者对象中,之后调用者对象就能执行命令。
模拟命令模式编码。
1、定义命令接口
  1. // Command 接口
  2. public interface Command {
  3.     void execute();  // 执行命令
  4. }
复制代码
1.gif
2、具体命令类
  1. // ConcreteCommand 实现 Command 接口
  2. public class LightOnCommand implements Command {
  3.     private Light light;
  4.     public LightOnCommand(Light light) {
  5.         this.light = light;
  6.     }
  7.     @Override
  8.     public void execute() {
  9.         light.turnOn();  // 执行具体的操作
  10.     }
  11. }
  12. public class LightOffCommand implements Command {
  13.     private Light light;
  14.     public LightOffCommand(Light light) {
  15.         this.light = light;
  16.     }
  17.     @Override
  18.     public void execute() {
  19.         light.turnOff();  // 执行具体的操作
  20.     }
  21. }
复制代码
2.gif
3、接收者
  1. // Receiver - 执行操作的对象
  2. public class Light {
  3.     public void turnOn() {
  4.         System.out.println("Light is ON");
  5.     }
  6.     public void turnOff() {
  7.         System.out.println("Light is OFF");
  8.     }
  9. }
复制代码
3.gif
4、调用者
  1. // Invoker - 调用命令的对象
  2. public class RemoteControl {
  3.     private Command command;
  4.     public void setCommand(Command command) {
  5.         this.command = command;
  6.     }
  7.     public void pressButton() {
  8.         command.execute();  // 按下按钮,执行命令
  9.     }
  10. }
复制代码
4.gif
5、客户端
  1. // Client - 客户端
  2. public class Client {
  3.     public static void main(String[] args) {
  4.         Light livingRoomLight = new Light();
  5.         
  6.         // 创建命令对象
  7.         Command lightOn = new LightOnCommand(livingRoomLight);
  8.         Command lightOff = new LightOffCommand(livingRoomLight);
  9.         
  10.         // 创建调用者对象
  11.         RemoteControl remote = new RemoteControl();
  12.         
  13.         // 设置命令并执行
  14.         remote.setCommand(lightOn);
  15.         remote.pressButton();  // 输出: Light is ON
  16.         
  17.         remote.setCommand(lightOff);
  18.         remote.pressButton();  // 输出: Light is OFF
  19.     }
  20. }
复制代码
5.gif
命令模式的优缺点。
优点:

  • 扩展性强:可以通过添加新的命令类来扩展系统,而不需要改变现有的类。只需要实现新的命令类并将其传递给调用者即可。
  • 支持撤销操作:命令模式非常适合实现撤销功能(Undo)。具体命令可以保存执行前的状态并在需要时撤销该命令。
  • 支持队列操作:可以将命令排入队列,或者将命令进行日志记录,从而支持命令的回放等操作。
缺点:

  • 类的数量增加:每一个命令对象都需要一个类,这可能会导致类的数量迅速增加,尤其是系统中有很多操作时。
  • 设计上较为复杂:引入命令模式会导致系统结构变得更复杂,尤其是在小型系统中,可能会觉得过度设计。
原型模式可用于保存命令模式的历史记录。
模式带来的设计复杂度的增加是随着需求而增加的,它减少的是系统各组件的耦合度。
不敢停歇,不敢哭泣,不敢抱怨,从深夜到黎明。-- 烟沙九洲
 ◀
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2025-11-9 00:25:41

举报

您需要登录后才可以回帖 登录 | 立即注册