"""
命令模式
在請求者和請求實現者之間,把請求抽象成命令,並新增乙個命令接受和分發者,實現請求者和實現者的解耦
如客戶(請求者)去燒烤店吃飯,並不需要認識燒烤boy(實現者),只需要有選單(命令),服務員(命令接收和分發者),然後根據
選單給服務員下單就好了。然後選單有會有記錄,我們可以要求撤銷和重做,燒烤店可以拒絕我們的某個選單。
優點:1、可以有乙個命令列表;2、命令可以很容易寫入日誌;3、命令可以被撤銷或重做;4、命令實現者可以拒絕命令;5、實現了請求者
和實現者的解耦;6、要加入新的命令很容易,增加個命令類,實現者能做對應的命令
"""from abc import abcmeta, abstractmethod
class
cooker
(object):
""" 廚師
"""def__init__
(self):
self._num_yang = 1
self._num_niu = 1
defcook_yang
(self):
if self._num_yang <= 3:
print("燒烤羊肉串")
self._num_yang += 1
else:
print("沒羊肉串了")
defcook_niu
(self):
if self._num_niu <= 3:
print("燒烤牛肉串")
self._num_niu += 1
else:
print("沒牛肉串了")
class
command
(object):
""" 抽象選單
"""__metaclass__ = abcmeta
def__init__
(self, name):
self.cooker = cooker()
self.name = name
@abstractmethod
defcook
(self):
pass
class
commandyang
(command):
def__init__
(self, name):
super(commandyang, self).__init__(name)
defcook
(self):
self.cooker.cook_yang()
class
commandniu
(command):
def__init__
(self, name):
super(commandniu, self).__init__(name)
defcook
(self):
self.cooker.cook_niu()
class
waiter
(object):
def__init__
(self):
self._command_list =
self._menu = none
self._kehu = none
defset_kehu
(self, kehu):
self._kehu = kehu
defset_order
(self, command, num=1):
print("加菜:" + command.name)
for i in range(num):
defremove_order
(self, command, num=1):
print("減菜:" + command.name)
try:
for i in range(num):
self._command_list.remove(command)
except exception as e:
print("沒點那麼多菜")
defnotify
(self):
print("下單啦:")
self._menu = order(self._kehu, self._command_list)
self._menu.show()
for command in self._command_list:
command.cook()
self._command_list =
print("")
class
order
(object):
def__init__
(self, name, command_list):
self._command_list = command_list
self._name = name
defset_order
(self, command_list):
self._command_list = command_list
defset_name
(self, name):
self._name = name
defshow
(self):
print(self._name + ",您的選單是:")
for command in self._command_list:
print(command.name)
print("")
if __name__ == '__main__':
# 燒烤店初始化
command_yang = commandyang("羊肉串")
command_niu = commandniu("牛肉串")
waiter = waiter()
# 營業
waiter.set_kehu("張三")
waiter.set_order(command_yang, 4)
waiter.set_order(command_niu, 5)
waiter.notify()
Python設計模式 七 命令模式
命令模式 import os from os.path import lexists class movefilecommand object def init self,src,dest self.src src self.dest dest defexecute self self.rename...
python設計模式(十六) 命令模式
行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做 事務 等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將 行為請求者 與 行為實現者 解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式 command pattern 命...
python設計模式(十六) 命令模式
行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做 事務 等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將 行為請求者 與 行為實現者 解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式 command pattern 命...