命令模式

📢 本文由 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");
    }
}