命令模式目录
命令模式——封装调用
- 命令模式是一种行为设计模式,他用于封装触发事件(完成任何一个操作)所包含的所有信息。一般有方法名称,拥有方法对象,方法参数等。
一个安装向导的例子:每一步选择的都会存在Command对象里,在最后一步点击finish的时候,Command会运行execute进行安装。
class Wizard(object):
def __init__(self, src, rootdir):
self.choices = []
self.rootdir = rootdir
self.src = src
def preferences(self, command):
self.choices.append(command)
def execute(self):
for choice in self.choices:
if list(choice.values())[0]:
print("Copying binaries --", self.src, " to ", self.rootdir)
else:
print("No Operation")
if __name__ == '__main__':
wizard = Wizard('python', 'bin')
wizard.preferences({'python': True})
wizard.preferences({'java': False})
wizard.execute()
实现
证券交易所的例子
我想卖一个股票,在开市之前我提交给证券交易所卖股票申请,等股市一开,证券交易所就帮我卖掉
# 客户下订单的接口
from abc import ABCMeta, abstractmethod
class Order(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
# 具体实现类
# 买卖方法,execute来执行
class BuyStockOrder(Order):
def __init__(self, stock):
self.stock = stock
def execute(self):
self.stock.buy()
class SellStockOrder(Order):
def __init__(self, stock):
self.stock = stock
def execute(self):
self.stock.sell()
# StockTrade实现buy和sell方法
class StockTrade:
def buy(self):
print('买股票')
def sell(self):
print('卖股票')
# 调用者
class Agent:
def __init__(self):
self.__orderQueue = []
def place_order(self, order):
self.__orderQueue.append(order)
order.execute()
if __name__ == '__main__':
# 客户端
stock = StockTrade()
buy_stock = BuyStockOrder(stock)
sell_stock = SellStockOrder(stock)
# 命令者
agent = Agent()
agent.place_order(buy_stock)
agent.place_order(sell_stock)
'''结果
买股票
卖股票'''
命令模式的优缺点
优点
- 把调用操作的类与知道如何执行该操作的对象分开了
- 结合队列可以创造一系列命令
- 添加命令方便,不用改现有代码
- 可以用命令模式定义回滚系统
缺点
- 要很多类和对象协作,要确保正确
- 每个单独的命令都是一个类,增加了实现和维护的类的数量