命令模式:
命令模式(Command Pattern)是属于行为型的设计模式,它将请求封装为一个对象,使用户可以参数化其他对象的方法调用、队列或记录请求日志,以及支持可撤销的操作。这种模式把发出请求的责任和执行请求的对象分离开来。
角色与结构:
1 Command(命令接口/抽象命令类):
- 定义执行操作的接口,通常声明一个
execute()
方法,所有具体命令类都必须实现这个方法。
2 ConcreteCommand(具体命令类):
- 实现了 Command 接口,绑定一个接收者对象,并且在
execute()
方法中调用接收者的相应操作以完成请求。
3 Receiver(接收者):
- 执行命令动作的实际对象,知道如何执行命令请求。任何类都可以成为接收者。
4 Invoker(调用者):
- 负责调用命令对象执行请求,通常持有命令对象的引用并提供用于执行命令的方法。
工作原理:
- 当客户端创建一个具体命令对象时,会将其与接收者对象关联起来。
- 客户端通过调用者对象将命令传递给它。
- 调用者在需要时调用命令对象的
execute()
方法,从而间接调用接收者的业务方法执行操作。
示例代码:
命令模式java示例代码:
java
// 命令接口
interface Command {
void execute();
}
// 具体命令类
class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
// 接收者
class Receiver {
public void action() {
System.out.println("Executing the command...");
}
}
// 调用者
class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
if (command != null) {
command.execute();
}
}
}
// 客户端代码
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(); // 输出 "Executing the command..."
}
}
说明:在上面的代码中ConcreteCommand
类将 Receiver
对象的动作封装到其 execute()
方法中。当 Invoker
对象调用 executeCommand()
时,实际执行的是接收者的 action()
方法。
优点:
- 降低耦合度:调用者和接收者之间通过命令对象解耦,使得它们无需直接相互依赖。
- 增加新的命令容易:只需要定义一个新的具体命令类即可,调用者对新命令一无所知。
- 支持命令队列和撤销/重做功能:由于每个命令都是独立的对象,可以将多个命令存储在一个队列中,然后依次执行;同时,如果命令对象还实现了撤销和重做的逻辑,就可以方便地支持这些功能。
应用场景:
- GUI 应用程序中的菜单项和按钮点击事件处理。
- 命令行工具,每条命令对应一个具体的命令对象。
- 事务系统,每个事务操作作为一条命令,支持事务的提交、回滚等。