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