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。
關鍵用例:
- 實現回撥機制
- 實現撤消和重做功能
- 保持命令的歷史