命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销操作。
命令模式的优点:
- 能够容易设计一个命令队列
- 在需要情况下,可以较容易地将命令记入日志
- 允许接收请求的一方决定是否可以否决请求
- 可以轻易实现请求撤销和重做
- 符合开闭原则
from abc import ABCMeta, abstractmethod
class Command(metaclass=ABCMeta):
def __init__(self, chief):
self.chief = chief
@abstractmethod
def execute(self):
pass
class BakeMuttonCommand(Command):
def execute(self):
self.chief.execute_bake_mutton()
class BakeChickenWingCommand(Command):
def execute(self):
self.chief.execute_bake_chicken_wing()
class Chief:
def __init__(self, name):
self.name = name
def execute_bake_mutton(self):
print("{0} cope with order bake_mutton".format(self.name))
def execute_bake_chicken_wing(self):
print("{0} cope with order bake_chicken_wing".format(self.name))
class Waiter:
def __init__(self):
self.order = []
def set_order(self, command):
self.order.append(command)
def notify(self):
for command in self.order:
command.execute()
if __name__ == "__main__":
chief = Chief("Li")
waitress = Waiter()
mutton_command = BakeMuttonCommand(chief)
chicken_wing_command = BakeChickenWingCommand(chief)
waitress.set_order(mutton_command)
waitress.set_order(chicken_wing_command)
waitress.notify()