Python设计模式之命令模式

命令模式目录

命令模式——封装调用

  • 命令模式是一种行为设计模式,他用于封装触发事件(完成任何一个操作)所包含的所有信息。一般有方法名称,拥有方法对象,方法参数等。

一个安装向导的例子:每一步选择的都会存在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)
    
    '''结果
    买股票
    卖股票'''

命令模式的优缺点

优点

  • 把调用操作的类与知道如何执行该操作的对象分开了
  • 结合队列可以创造一系列命令
  • 添加命令方便,不用改现有代码
  • 可以用命令模式定义回滚系统

缺点

  • 要很多类和对象协作,要确保正确
  • 每个单独的命令都是一个类,增加了实现和维护的类的数量
上一篇:使用iscroll,无法正常滑动的原因


下一篇:雪球美股