Java 中的命令模式示例
维基百科定义:
命令模式是一种行为设计模式,其中一个对象用于封装执行操作或稍后触发事件所需的所有信息
来自 dofactory 的 UML 图 :
https://i.stack.imgur.com/0JiTY.gif
基本组件和工作流程:
Command
声明了一个像execute()
这样的抽象命令的接口Receiver
知道如何执行特定命令Invoker
持有ConcreteCommand
,必须执行Client
创建ConcreteCommand
并分配Receiver
ConcreteCommand
定义了Command
和Receiver
之间的绑定
通过这种方式,命令模式通过 Invoker 将 Sender (客户端)与 Receiver 分离。 Invoker 完全了解要执行哪个 Command , Command 知道要调用哪个 Receiver 来执行特定操作。 **** **** **** **** ****
代码段:
interface Command {
void execute();
}
class Receiver {
public void switchOn(){
System.out.println("Switch on from:"+this.getClass().getSimpleName());
}
}
class OnCommand implements Command{
private Receiver receiver;
public OnCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute(){
receiver.switchOn();
}
}
class Invoker {
private Command command;
public Invoker(Command command){
this.command = command;
}
public void execute(){
this.command.execute();
}
}
class TV extends Receiver{
public String toString(){
return this.getClass().getSimpleName();
}
}
class DVDPlayer extends Receiver{
public String toString(){
return this.getClass().getSimpleName();
}
}
public class CommandDemoEx{
public static void main(String args[]){
// On command for TV with same invoker
Receiver receiver = new TV();
Command onCommand = new OnCommand(receiver);
Invoker invoker = new Invoker(onCommand);
invoker.execute();
// On command for DVDPlayer with same invoker
receiver = new DVDPlayer();
onCommand = new OnCommand(receiver);
invoker = new Invoker(onCommand);
invoker.execute();
}
}
输出:
Switch on from:TV
Switch on from:DVDPlayer
说明:
在这个例子中,
- 命令界面定义了
execute()
方法。 - OnCommand 是 ConcreteCommand ,它实现了
execute()
方法。 - Receiver 是基类。
- TV 和 DVDPlayer 是两种类型的接收器,它们像 OnCommand 一样传递给 ConcreteCommand。
- Invoker 包含命令。这是将 Sender 与 Receiver 分离的关键。
- Invoker 接收 OnCommand - >,它调用 Receiver (TV)来执行此命令。
通过使用 Invoker,你可以打开电视和 DVDPlayer。如果你扩展此程序,你也关闭电视和 DVDPlayer。
关键用例:
- 实现回调机制
- 实现撤消和重做功能
- 保持命令的历史