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

在面向对象程序设计的范畴中,命令模式(Command Pattern)是一种设计模式,它尝试以对象来代表实际行动。具体来说,命令模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化,对请求进行排队或记录请求日志,以及支持可撤销操作。

命令模式的结构主要包括以下几个部分:

  1. Command:定义命令的接口,声明执行的方法。
  2. ConcreteCommand:命令接口实现对象,是"虚"的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
  3. Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  4. Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这是客户端真正触发命令并要求命令执行相应操作的地方。
  5. Client:创建具体的命令对象,并且设置命令对象的接收者。

命令模式的优点包括:

  • 降低对象之间的耦合度。
  • 新的命令可以很容易地加入到系统中。
  • 可以比较容易地设计一个组合命令。
  • 调用同一方法实现不同的功能。

命令模式的应用场景包括:

  • 多级回退操作:如果系统需要实现多级回退操作,所有用户的操作都以command对象的形式实现,系统可以简单地用stack来保存最近执行的命令,用户需要执行undo操作时,系统只需简单地弹出一个最近的command对象并执行其undo()方法。
  • 原子事务行为:借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,可以借助command对象保存状态,简单地处理回退操作。
  • 导航:在一个复杂的用户界面中,通常需要使用多个wizard页面来共同完成一个简单动作。在这种情况下,command类不包含任何跟用户界面有关的代码,可以分离用户界面与具体的处理逻辑。

当使用命令模式时,通常会涉及多个类和接口。下面是一个简单的命令模式的代码示例,用于演示其基本结构和用法。

java 复制代码
// Command 接口
public interface Command {
    void execute();
    void undo();
}

// Receiver 类
public class Receiver {
    public void action() {
        System.out.println("Action performed on receiver.");
    }

    public void undoAction() {
        System.out.println("Undo action performed on receiver.");
    }
}

// ConcreteCommand 类
public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.undoAction();
    }
}

// Invoker 类
public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }

    public void undoCommand() {
        command.undo();
    }
}

// Client 类
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);

        Invoker invoker = new Invoker();
        invoker.setCommand(command);

        // 执行命令
        invoker.executeCommand();

        // 撤销命令
        invoker.undoCommand();
    }
}

在这个例子中,Command 是一个接口,定义了 executeundo 方法。Receiver 是接收者,包含了需要执行的操作和撤销操作的方法。ConcreteCommandCommand 接口的具体实现,它持有一个 Receiver 对象,并在 executeundo 方法中调用该对象的相应方法。Invoker 是请求者,它持有一个 Command 对象,并提供了执行和撤销命令的方法。最后,Client 是客户端,它创建了 ReceiverConcreteCommandInvoker 对象,并设置了 Invoker 的命令,然后执行和撤销该命令。

运行 Client 类的 main 方法,你将看到类似下面的输出:

复制代码
Action performed on receiver.
Undo action performed on receiver.

这表示命令已成功执行并被撤销。

相关推荐
漂洋过海的鱼儿7 小时前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding15 小时前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding17 小时前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding17 小时前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖17 小时前
桥模式-结构型
c++·设计模式
连山齐名17 小时前
设计模式之一——堵塞队列
设计模式
会员果汁17 小时前
19.设计模式-命令模式
设计模式·命令模式
茶本无香18 小时前
设计模式之六—组合模式:构建树形结构的艺术
java·设计模式·组合模式
橘色的喵18 小时前
嵌入式 C++ 高性能流式架构的设计
数码相机·设计模式
会员果汁18 小时前
20.设计模式-职责链模式
设计模式