示例
维基百科定义:命令模式是一种行为设计模式,其中的对象用于封装以后执行动作或触发事件所需的所有信息。
来自factory的UML图:
基本组件和工作流程:Command 声明抽象命令的接口,例如 execute()
Receiver 知道如何执行特定命令
Invoker持有ConcreteCommand,必须执行
Client创建ConcreteCommand并分配Receiver
ConcreteCommand定义Command和之间的绑定Receiver
通过这种方式,命令模式通过Invoker将发件人(客户端)与Receiver解耦。调用具有的完整的知识命令要执行,并命令知道哪些接收器被调用执行特定操作。
程式码片段:
interface Command {
void execute();
}
class Receiver {
public void switchOn(){
System.out.println("开启:"+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[]){
// 在具有相同调用者的电视上命令
Receiver receiver = new TV();
Command onCommand = new OnCommand(receiver);
Invoker invoker = new Invoker(onCommand);
invoker.execute();
// 具有相同调用程序的DVDPlayer的命令
receiver = new DVDPlayer();
onCommand = new OnCommand(receiver);
invoker = new Invoker(onCommand);
invoker.execute();
}
}
输出:
开启:TV
开启:DVDPlayer
说明:
在这个例子中命令界面定义execute()方法。
OnCommand是ConcreteCommand,它实现execute()方法。
接收器是基类。
TV和DVDPlayer是两种类型的Receiver,它们像OnCommand一样传递给ConcreteCommand。
调用者包含Command。这是将Sender与Receiver分离的关键。
调用器接收按需- >它调用接收器(TV)到执行此命令。
通过使用Invoker,您可以打开TV和DVDPlayer。如果扩展此程序,则也将同时关闭TV和DVDPlayer。
关键用例:实现回调机制
实现撤消和重做功能
维护命令历史记录