📢 本文由 gemini-2.5-flash 翻譯
Command Pattern 物件行為模式
目的
將一個請求封裝成一個物件,以便能用不同的請求對客戶端進行參數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作
結構

其中:
- Command 宣告執行操作的介面
- ConcreteCommand 將一個接收者物件綁定到一個動作;呼叫接收者相對應的操作,以實作 Execute
- Client 建立一個具體命令物件並設定它的接收者
- Invoker 要求該命令執行這個請求
- Receiver 知道如何實施與執行一個請求相關的操作。任何類別都可能作為一個接收者
適用性
Command 模式適用於:
- 抽象出待執行的動作以參數化某物件
- 在不同的時刻指定、排列和執行請求
- 支援取消操作
- 支援修改日誌
- 用建構在基本操作上的高階操作來建構一個系統
範例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| public class CommandPattern {
public static void main(String[] args) {
// 接收者 物件 電視機
Tv tv = new Tv();
// 命令物件
Command oncommand = new OnCommand(tv);
Command offcommand = new OffCommand(tv);
// 請求者
Invoker invoker = new Invoker();
// 開機
invoker.setCommand(oncommand);
invoker.Execute();
// 關機
invoker.setCommand(offcommand);
invoker.Execute();
}
}
class Invoker{ // 請求者
private Command command; // 命令
public void setCommand(Command command){ // 設定請求者 的 請求的命令
this.command = command;
}
public void Execute(){ // 執行命令
command.Execute();
}
}
interface Command{ // 命令介面
public void Execute(); // 執行命令
}
class OnCommand implements Command{ // 開機命令
private Tv tv;
public OnCommand(Tv tv){
this.tv = tv;
}
@Override
public void Execute(){
tv.OnAction();
}
}
class OffCommand implements Command{ // 關機命令
private Tv tv;
public OffCommand(Tv tv){
this.tv = tv;
}
@Override
public void Execute(){
tv.OffAction();
}
}
class Tv{ // 接收者 電視機
public void OnAction(){
System.out.println("Tv On");
}
public void OffAction(){
System.out.println("Tv Off");
}
}
|