目录
一、什么是命令模式
命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象。这个模式提供了一种机制,使得你可以将操作的发出者(发起请求的对象)和操作的执行者(接收请求的对象)解耦,同时允许你根据不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
二、命令模式的角色
命令模式包含以下几个关键角色:
-
Command(命令接口):
- 定义命令的接口,通常至少包含一个
execute()
方法,用于执行命令。
- 定义命令的接口,通常至少包含一个
-
ConcreteCommand(具体命令类):
- 实现命令接口,对应于具体的行为和接收者的绑定。它内部持有接收者(Receiver)的引用,并在
execute()
方法中调用接收者的方法。
- 实现命令接口,对应于具体的行为和接收者的绑定。它内部持有接收者(Receiver)的引用,并在
-
Invoker(调用者):
- 要求命令对象执行请求。调用者持有命令对象,并在某个时刻调用命令对象的
execute()
方法。
- 要求命令对象执行请求。调用者持有命令对象,并在某个时刻调用命令对象的
-
Receiver(接收者):
- 知道如何实施与执行一个请求相关的操作。它执行与命令相关的实际工作。
三、命令模式的典型应用场景
-
解耦操作调用者和执行者: 在系统需要高度解耦的场景中,命令模式可以将发起操作的对象(调用者)和执行操作的对象(接收者)分开,增加系统的灵活性。
-
分布式系统: 在分布式系统中,命令模式可以用来封装远程调用,使得远程调用像本地调用一样简单。
四、命令模式在Runnable中的应用
Runnable
接口在 Java 中是一个函数式接口,它只有一个方法 run()
。虽然 Runnable
本身并不是一个命令模式的实现,但它经常被用来模拟命令模式的行为。在命令模式中,Runnable
可以作为一个命令对象,封装了要执行的操作。
以下是 Runnable
在命令模式中的一个应用示例:
-
命令接口(Command): 在 Java 中,这通常是一个包含
execute()
方法的接口。 -
具体命令类(ConcreteCommand): 实现命令接口的类,它的
execute()
方法会调用Runnable
的run()
方法。 -
调用者(Invoker): 一个对象,它持有命令对象,并在需要时调用命令对象的
execute()
方法。
Runnable 在命令模式使用示例:
// 命令接口
interface Command {
void execute();
}
// 具体命令类
class ConcreteCommand implements Command {
private Runnable runnable;
public ConcreteCommand(Runnable runnable) {
this.runnable = runnable;
}
@Override
public void execute() {
runnable.run();
}
}
// 调用者
class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
// Runnable 实现
class Task implements Runnable {
@Override
public void run() {
System.out.println("Task is running");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Task task = new Task();
Command command = new ConcreteCommand(task);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand(); // 输出:Task is running
}
}
在这个例子中,Task
是一个实现了 Runnable
接口的类,它封装了一个任务。ConcreteCommand
是一个具体命令类,它持有一个 Runnable
对象,并在 execute()
方法中调用 Runnable
的 run()
方法。Invoker
是调用者,它持有命令对象,并在适当的时候执行命令。这样,Runnable
就充当了命令模式中的命令对象,封装了要执行的操作。