Python設計模式-命令模式

小屋子大俠發表於2017-06-24

Python設計模式-命令模式

程式碼基於3.5.2,程式碼如下;

#coding:utf-8
#命令模式

class barbecuer():
    def bakeButton(self):
        print("烤羊肉")
    def chickenButton(self):
        print("烤雞翅")

class command():
    def __init__(self,receive):
        self.receive = receive
    def excuteComand(self):
        raise NotImplementedError

class bakeCommand(command):
    def excuteComand(self):
        self.receive.bakeButton()

class chickenCommand(command):
    def excuteComand(self):
        self.receive.chickenButton()

class waiter():
    def __init__(self):
        self.commandList = []
    def add(self,command):
        self.commandList.append(command)
    def remove(self,command):
        self.commandList.remove(command)
    def inotify(self):
        for command in self.commandList:
            command.excuteComand()

if __name__ == "__main__":
    recv = barbecuer()
    bc = bakeCommand(recv)
    cc = chickenCommand(recv)
    bc1 = bakeCommand(recv)
    w = waiter()
    w.add(bc)
    w.add(cc)
    w.add(bc1)
    w.inotify()

命令模式的分析與解讀

命令模式

命令模式,將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數優化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。

程式碼解讀

1、先定義了barbecuer類,為命令的執行者,分別擁有兩個執行的方法,bakeButton和chickenButton,後續下達的命令只能在這兩個方法中進行選擇;
2、定義了command類,所以繼承自該類的類必須實現excuteComand方法,並在初始化時,傳入命令執行者的物件;
3、定義了繼承自command類的bakeCommand和chickenCommand類,該命令分別對贏命令執行者barbecuer的兩個方法,烤肉和烤雞翅;
4、通過定義waiter類,來對繼承自command類的類進行增加或刪除的管理,waiter類通過inotify方法來實現對命令的執行。

程式碼執行結果如下:

”’
烤羊肉
烤雞翅
烤羊肉
”’

命令模式應用場景:

1、觸發-反饋機制的系統,都可以使用命令模式思想,如基於管道結構的命令系統,GUI系統中的操作反饋。

優缺點分析

優點

1、低耦合,呼叫者和接受者之間沒有什麼直接關係,通過命令中的execute介面聯絡;
2、擴充套件性好,新命令容易加入,也容易拼出組合命令;
3、可以容易的實現對請求的撤銷和重做;
4、允許接手請求的一方決定是否要否決請求。

缺點

1、如果業務場景中命令比較多,那麼對應命令類和命令物件的數量也會增加,這樣系統會膨脹的很大。

備註

 class Command():
        def __init__(self,receiver):
            self.receiver = receiver
        def execute(self):
            raise NotImplementedError

    class ConcreteCommand(Command):
        def execute(self):
            self.receiver.action()

    class Receiver():
        def action(self):
            print("receiver actiono")

    class Invoker():

        def setCommand(self,command):
            self.command = command
        def executeCommand(self):
            self.command.execute()

    if __name__ == "__main__":
        receiver = Receiver()
        cm = ConcreteCommand(receiver)
        ik = Invoker()
        ik.setCommand(cm)
        ik.executeCommand()

相關文章