命令模式

定义

将复杂的执行过程及其所需的全部信息封装在一个事件命令中。

用途

其核心在于封装和调用。在给定所有所需参数后,将要执行的一些列复杂过程封装在一个命令函数中。通过一句简单的、轻量级的小操作命令,来完成一系列高级命令。

例如:使用打印机时,设置好打印机参数(黑白、单双面、纸张大小等),只需要一个命令“打印”,即可完成打印机的一系列操作并完成打印任务。

优点

  • 调用操作和实际如何执行操作之间相互解耦。
  • 追加命令更容易。
  • 可以定义命令回滚方法。

缺点

大量的类和对象相互协作,维护困难。

示例:

1. 命令模式

模拟股票买卖过程。其中“买”和“卖”即为两个命令。Agent用来调用命令。


>>> class BuyOrder(object):
        def __init__(self, stock):
            self.stock = stock
        
        def execute(self):
            self.stock.buy()
            
>>> class SellOrder(object):
        def __init__(self, stock):
            self.stock = stock
        
        def execute(self):
            self.stock.sell()           
  
>>> class StockTrade(object):
        def buy(self):
            print("买进股票")
        def sell(self):
            print("卖出股票")

>>> class Agent(object):
        def __init__(self):
            self.__orderQueue = []
        
        def executeOrder(self, order):
            self.__orderQueue.append(order)
            order.execute()
        def printOrderQueue(self):
            print(list(map(lambda x : type(x).__name__ , self.__orderQueue)))
        
        
>>> stock = StockTrade()  
>>> buyStock = BuyOrder(stock) #创建命令,但并不执行!
>>> sellStock = SellOrder(stock)

>>> agent = Agent()
>>> agent.executeOrder(buyStock) # 得到命令后执行!
买进股票

>>> agent.executeOrder(sellStock)  
卖出股票

>>> agent.printOrderQueue()
['BuyOrder', 'SellOrder']   

创建命令对象SellOrder只用来封装命令本身SellOrder.execute()
执行对象Agent用来执行命令的具体内容StockTrade.sell()