命令模式,正如模式的名字一樣,該模式中的不同操作都可以當做不同的命令來執行,可以使用隊列來執行一系列的命令,也可以單獨執行某個命令。該模式重點是將不同的操作封裝為不同的命令對象,將操作的調用者與執行者進行解耦。 命令模式中的Command對象(即每一個命令,或者說命令對象)用於封裝在完成某項操作或觸 ...
命令模式,正如模式的名字一樣,該模式中的不同操作都可以當做不同的命令來執行,可以使用隊列來執行一系列的命令,也可以單獨執行某個命令。該模式重點是將不同的操作封裝為不同的命令對象,將操作的調用者與執行者進行解耦。
命令模式中的Command對象(即每一個命令,或者說命令對象)用於封裝在完成某項操作或觸發一個事件時所需的全部信息,包括需要完成此操作的對象、該對象的方法以及該方法所需的參數,即Command對象中會封裝好某項操作所需的所有信息,使用時只需要調用對應的execute方法即可,即表示“這條命令”的執行。通常我們會使用到不只一個命令,因此可能會創建多個Command對象,代表多個不同操作的命令。
命令模式三個角色:
- Command:命令對象,對特定的操作進行封裝,用於創建不同的命令。
- Receiver:參數接受者,即具體操作的執行者。
- Invoker:調用命令的對象,由此對象來調用不同的命令對象(即命令隊列的創建者)。
命令模式核心思想:
- 將請求封裝為對象(即封裝為Command命令對象)。
- 可用不同的請求對客戶進行參數化(根據不同的操作進行不同命令的參數傳值)。
- 允許將請求保存在隊列中。
- 提供面向對象的回調。
命令模式優點:
- 將操作的調用者和執行者解耦,使用Command對象來作為中間的代理者。
- 可以使用隊列,以便創建和管理一系列的命令。
- 添加新的命令更加容易,且無需更改現有的代碼。
- 可以使用命令模式實現重做或回滾操作,以及非同步任務執行,只需要執行對應的命令即可。
命令模式缺點:
- 命令模式可能需要創建許多的類和對象來進行相互的協作,所以增加了實現和維護的複雜度。
- 因為每一個命令都是一個Command類,所以如果命令過多,那實現和維護起來就更加的麻煩。
簡單示例:
from abc import ABCMeta, abstractmethod class Receiver: """Receiver:定義各種方法以便執行不同的操作""" def action1(self): print('Execute action1...') def action2(self): print('Execute action2...') class Command(metaclass=ABCMeta): """命令對象介面:定義統一的命令執行方法""" @abstractmethod def execute(self): pass class Action1(Command): """命令1:用於執行操作action1""" def __init__(self, receiver): self.receiver = receiver def execute(self): self.receiver.action1() class Action2(Command): """命令2:用於執行操作action2""" def __init__(self, receiver): self.receiver = receiver def execute(self): self.receiver.action2() class Invoker: """創建命令隊列,調用並執行隊列中的命令""" def __init__(self): self.actions = [] def append_action(self, action): self.actions.append(action) def execute_actions(self): for action in self.actions: action.execute() if __name__ == '__main__': receiver = Receiver() action1 = Action1(receiver) action2 = Action2(receiver) invoker = Invoker() invoker.append_action(action1) invoker.append_action(action2) invoker.execute_actions()