python 設計模式之命令(Command)模式

#寫在前面

也瞭解了很多設計模式了,他們都有一個通病,那就是喜歡把簡單的東西複雜化。好比在不一樣的類中加個第三者。哈哈哈,簡單變複雜是有目的的,那就是下降耦合度,加強可維護性,提升代碼複用性,使代碼變得健壯。html

 

 #小白入門--理解什麼是命令模式

學校中、生活中、社會中老是會存在必定的階層,雖然咱們不少人都不可承認階層的存在。命令這一詞也就在階層中誕生。家長命令孩子,老師命令學生,領導命令小婁婁。這些都在咱們的生活存在的東西,相信這一個模式學習起來也會比較簡單的。此次咱們就舉一個領導命令員工的例子來學習命令模式。
  工做中領導常常會叫(命令)你去作一些事情,可是領導並不關心你怎麼作的,只須要知道你作的結果就行了。怎麼作是你本身的事情,作很差就等着加班吧(開玩笑的,通常都會說本身自願的,哈哈),作的好功勞也很差是你的,哈哈好像有點小黑暗。通常大領導會叫小領導作事情,小領導才叫小婁婁。而後功勞你懂的。很少說了,說多了都是淚。python

 

#命令模式定義

命令模式是一個高內聚的模式,其定義爲:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(將一個請求封裝成一個對象,從而讓你使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌,能夠提供命令的撤銷和恢復功能。)設計模式

 

#命令模式結構圖

 

#命令模式參與者: 

 ◊ Command:命令抽象類,聲明一個執行操做的接口Execute,該抽象類並不實現這個接口,全部的具體命令都繼承自命令抽象類。
  ◊ ConcreteCommand
    ° 定義一個接收者對象與動做之間的請求綁定
    ° 調用Receiver的操做,實現Execute方法
  ◊ Invoker:命令的接收者,將命令請求傳遞給相應的命令對象,每一個ConcreteCommand都是一個Invoker的成員
  ◊ Receiver:命令的接收者,知道如何實施與執行一個請求相關的操做
  ◊ Client:客戶端程序,建立一個具體命令對象並設定它的接收者
  Command對象做爲Invoker的一個屬性,當點擊事件發生時,Invoker調用方法Invoke()將請求發送給ConcreteCommand,再由ConcreteCommand調用Execute()將請求發送給Receiver,Client負責建立全部的角色,並設定Command與Invoker和Receiver之間的綁定關係。學習

 

 

Command:聲明接口操做(抽象命令)
ConcreteCommand:將一個Receiver對象和一個操做綁定在一塊兒(具體的命令,好比,去把房子蓋好)
Client:建立ConcreteCommand對象並設定其接收者(這是大領導,負責下達命令,其餘都不關心)
Invoker:要求該ConcreteCommand執行這個請求(這是小領導,大領導給小領導下達的命令,小領導讓小嘍嘍去辦)
Receiver:知道如何實施與執行一個請求相關的操做(這是小嘍嘍,負責執行小嘍嘍傳達的命令,苦活累活都得幹)


測試

抽象命令
具體命令
命令接收者:執行命令
命令調用者
客戶端:發送命令.net

 

 

 #舉個例子

 

 

 

#抽象命令接口,聲明接口Execute,具體命令都繼承這個接口
class Command:
    def Execute(self):
        pass


#具體命令,coding,testing,,把[小嘍嘍]和[幹活]綁定在一塊兒
class ConcreteCommand1(Command): #寫代碼命令
    def __init__(self,receiver):
        self.receiver=receiver

    def execute(self):
        self.receiver.coding()

class ConcreteCommand2(Command): #進行測試命令
    def __init__(self,receiver):
        self.receiver=receiver

    def execute(self):
        self.receiver.testing()


#命令接受者,負責執行具體命令,是真正作事的人,定義小嘍嘍
class Receiver:
    def coding(self):
        print('我是小嘍囉,苦活累活都是個人')
        print('...小領導傳來命令了,正在coding,請勿打擾...')

    def testing(self):
        print('我是小嘍囉,苦活累活都是個人')
        print('...小領導傳來命令了,正在testing,請勿打擾...')


#命令調用者,至關於小領導,負責傳達大領導的命令,讓小嘍囉去執行
class Invoker:
    def execute(self,cmd):
        print('李工,上級下達了命令,這周要把代碼碼完,測試作完,你去作吧')
        cmd.execute()
    
   
#模仿client,是大領導,負責下達命令
if __name__=='__main__':
    receiver=Receiver()

    #大領導下達了倆命令
    code=ConcreteCommand1(receiver)
    test=ConcreteCommand2(receiver)
   
    invoker=Invoker()
    #小領導傳達大領導的命令,讓小嘍囉去執行
    invoker.execute(code)
    print('======================')
    invoker.execute(test)

 

參考:設計

https://www.kancloud.cn/sstd521/design/193555日誌

https://www.cnblogs.com/libingql/p/3651624.htmlcode

https://www.cnblogs.com/liaoweipeng/p/5693154.htmlhtm

https://blog.csdn.net/ruoyunliufeng/article/details/78725188

https://www.cnblogs.com/chenpi/p/5216488.html

https://blog.csdn.net/ruoyunliufeng/article/details/78725188

相關文章
相關標籤/搜索