python設計模式(十六) 命令模式

2021-09-11 01:43:51 字數 2033 閱讀 1873

「行為請求者」與「行為實現者」通常呈現一種「緊耦合」。但在某些場合,比如要對行為進行「記錄、撤銷/重做、事務」等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將「行為請求者」與「行為實現者」解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式(command pattern)

命令模式應該有一下幾個角色:

command:

定義命令的介面,宣告執行的方法,可以理解為乙個基類。

concretecommand:

命令介面實現物件,通常會持有接收者,並呼叫接收者的功能來完成命令要執行的操作。

receiver:

接收者,真正執行命令的物件。任何類都可能成為乙個接收者,只要它能夠實現命令要求實現的相應功能。

invoker:

要求命令物件執行請求,通常會持有命令物件,可以持有很多的命令物件,相當於使用命令物件的入口。

client:

建立具體的命令物件,組裝命令物件和接收者,或許,把這個client稱為裝配者會更好理解,因為真正使用命令的客戶端是從invoker來觸發執行。

示例code:

# -*- coding:utf-8 -*-

class command:

"""宣告命令模式介面"""

def __init__(self, obj):

self.obj = obj

def execute(self):

pass

class concretecommand(command):

"""實現命令模式介面"""

def execute(self):

self.obj.run()

class invoker:

"""接受命令並執行命令的介面"""

def __init__(self):

self._commands =

def add_command(self, cmd):

def remove_command(self, cmd):

self._commands.remove(cmd)

def run_command(self):

for cmd in self._commands:

cmd.execute()

class receiver:

"""具體動作"""

def __init__(self, word):

self.word = word

def run(self):

print(self.word)

def client():

"""裝配者"""

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...