Python設計模式之命令模式簡單樣本,python設計模式樣本
本文執行個體講述了Python設計模式之命令模式。分享給大家供大家參考,具體如下:
命令模式介紹:
在物件導向編程中,命令模式是概括所有方法資訊的設計模式。
此模式對象包涵方法名,及其相關參數值。
命令模式是一個分類的觀察者設計模式,在命令模式下,對象被概括為一個命令表單,此表單包涵了所有使用者需要的方法。
舉個例子:如果有個按鈕是使用者介面“red”,當被觸碰的時候,會啟動背景“turn red”介面。現在使用者並不知道,通過什麼類或者方法的介面能夠讓幕後處理“turn red”操作,但是這個命令被發送了(觸碰“red”按鈕),會使得幕後處理“turn red”操作。因此,命令模式給使用者一個介面,而不用讓使用者瞭解哪些是實際執行的程式,也不會影響到使用者程式。
實現命令模式的關鍵就是讓調用者不要包涵底層實際命令執行代碼,相同的調用者應該採用相同的介面。
命令模式是由三個組件構成,客戶,調用者,接受者。
客戶:一個執行個體化的對象
調用者:決定哪個方法被調用
接受者:實際命令的執行者
Example:
實現一個開關
切換ON/OFF
用開關ON/OFF去寫入程式碼一個事件
代碼如下:
class Switch: ''' The INVOKER class''' def __init__(self, flipUpCmd, flipDownCmd): self.__flipUpCommand = flipUpCmd self.__flipDownCommand = flipDownCmd def flipUp(self): self.__flipUpCommand.execute() def flipDown(self): self.__flipDownCommand.execute()class Light: '''The RECEIVER Class''' def turnOn(self): print "The light is on" def turnOff(self): print "The light is off"class Command: """The Command Abstrace class""" def __init__(self): pass def execute(self): passclass FlipUpCommand(Command): '''The Command class for turning on the light''' def __init__(self, light): self.__light = light def execute(self): self.__light.turnOn()class FileDownCommand(Command): '''The Command class for turning off the light''' def __init__(self, light): Command.__init__(self) self.__light = light def execute(self): self.__light.turnOff()class LightSwitch: '''The Client Class''' def __init__(self): self.__lamp = Light() self.__switchUp = FlipUpCommand(self.__lamp) self.__switchDown = FileDownCommand(self.__lamp) self.__switch = Switch(self.__switchUp, self.__switchDown) def switch(self, cmd): cmd = cmd.strip().upper() try: if cmd == "ON": self.__switch.flipUp() elif cmd == "OFF": self.__switch.flipDown() else: print "Argument \"ON\" or \"OFF\" is required" except Exception,msg: print "Exception occured:%s" % msg#Execute if the file is run as a script and not imported as a moduleif __name__ == "__main__": lightSwitch = LightSwitch() print "Switch ON test" lightSwitch.switch("ON") print "Switch OFF test" lightSwitch.switch("OFF") print "Invalid Command test" lightSwitch.switch("****")
運行結果:
總結:物件導向的方法,就是這麼牛叉啊,代碼看得讓人頭暈,層層的封裝。警惕物件導向編程的過度對象化。