「行為請求者」與「行為實現者」通常呈現一種「緊耦合」。但在某些場合,比如要對行為進行「記錄、撤銷/重做、事務」等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將「行為請求者」與「行為實現者」解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式(command pattern)
命令模式應該有一下幾個角色:
command:
定義命令的介面,宣告執行的方法,可以理解為乙個基類。
concretecommand:
命令介面實現物件,通常會持有接收者,並呼叫接收者的功能來完成命令要執行的操作。
receiver:
接收者,真正執行命令的物件。任何類都可能成為乙個接收者,只要它能夠實現命令要求實現的相應功能。
invoker:
要求命令物件執行請求,通常會持有命令物件,可以持有很多的命令物件,相當於使用命令物件的入口。
client:
建立具體的命令物件,組裝命令物件和接收者,或許,把這個client稱為裝配者會更好理解,因為真正使用命令的客戶端是從invoker來觸發執行。
示例code:
# -*- coding:utf-8 -*-
class
command:
"""宣告命令模式介面"""
def__init__
(self, obj):
self.obj = obj
defexecute
(self):
pass
class
concretecommand
(command):
"""實現命令模式介面"""
defexecute
(self):
self.obj.run()
class
invoker:
"""接受命令並執行命令的介面"""
def__init__
(self):
self._commands =
defadd_command
(self, cmd):
remove_command
(self, cmd):
self._commands.remove(cmd)
defrun_command
(self):
for cmd in self._commands:
cmd.execute()
class
receiver:
"""具體動作"""
def__init__
(self, word):
self.word = word
defrun
(self):
print(self.word)
defclient
():"""裝配者"""
test = invoker()
cmd1 = concretecommand(receiver('命令一'))
test.add_command(cmd1)
cmd2 = concretecommand(receiver('命令二'))
test.add_command(cmd2)
cmd3 = concretecommand(receiver('命令三'))
test.add_command(cmd3)
test.run_command()
if __name__ == '__main__':
client()
--------------------------
命令一命令二
命令三
命令模式的幾個核心角色及其分工:
command(命令基類):主要宣告抽象命令類的介面
concretecommand(命令實現):複寫基類中宣告的介面,實現具體的呼叫功能
receiver(命令的內容):具體執行動作的物件
invoker(命令排程和執行):全部命令的執行和排程入口
client(命令裝配者):建立具體的命令物件,組裝命令物件和接收者
python設計模式(十六) 命令模式
行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做 事務 等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將 行為請求者 與 行為實現者 解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式 command pattern 命...
設計模式 Abstract Factory模式
還是乙個創造型模式,可以簡單的認為,創造型模式就是對使用者使用new的乙個封裝,封裝作為物件導向乙個重要的特性,它絕對不是一對大括號那麼簡單,他重要的是封裝變化點.如果沒有變化,那就別封裝吧,直接讓使用者new吧,這樣效率是最高的,但因為會有變化,所以才會有物件導向和設計模式.抽象工廠是應對這樣的一...
設計模式 abstract factory模式
含義 抽象工廠將 抽象零件 組裝成 抽象產品 理解 相比於工廠方法模式,可以根據不同的介面建立不同的產品,說白了就是將乙個介面變成兩個介面,各自返回不同的抽象產品 例子 class car 抽象產品 class bencicar public car class baomacar public ca...