命令模式

命令模式属于行为型模式
行为型模式侧重于对象的响应性,利用对象之间的交互实现更强大的功能
其中对象用于封装在完成一项操作或在触发一个事件时所需的全部信息:
1、方法名称
2、拥有方法的对象
3、方法参数的值

命令模式术语

Command: 声明执行操作的接口
ConcreteCommand:将一个Receiver对象和一个操作绑定在一起
Receiver:创建ConcreteCommand对象并设定其接收者
Invoker:要求该ConcreteCommand执行这个请求
Client:知道如何实施与执行一个请求相关的操作

执行流程:
客户端请求执行命令,
调用者接受命令,封装它并将其放置到队列中,
ConcreteCommand类根据所请求的命令来知道接收者执行特定的动作

命令模式主要意图

1、将请求封装为对象
2、可用不同的请求对客户进行参数化
3、允许将请求保存在队列中
4、提供面向对象的回调

命令模式适用场景

1、根据需要执行的操作对对象进行参数化
2、将操作添加到队列并在不同地点执行请求
3、创建一个结构来根据较小操作完成高级操作

命令模式应用

1、重做或回滚操作
2、异步任务执行

命令模式的优点

1、将调用操作的类与知道如何执行该操作的对象解耦
2、提供队列系统后,可以创建一系列命令
3、添加新命令更容易,并且无需更改现有代码
4、可以使用命令模式定义回滚系统

命令模式的缺点

1、为了实现目标,需要大量的类和对象进行协作
2、每个单独的命令都是一个ConcreteCommand类,从而增加了需要实现和维护的类的数量

代码实例:

# -*- coding: utf-8 -*-

from abc import ABCMeta, abstractmethod


# 提供接口Command
class Order(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass


# 具体命令 ConcreteCommand
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()


# Receiver对象
class StockTrade(object):
    def buy(self):
        print("buy stock")

    def sell(self):
        print("sell stock")


# 调用者Agent,中介
class Broker(object):
    def __init__(self):
        self.__order_list = []  # 订单队列

    def add_order(self, order):
        self.__order_list.append(order)

    def place_order(self):
        for order in self.__order_list:
            order.execute()

        self.__order_list.clear()


if __name__ == '__main__':
    # client
    stock = StockTrade()
    buy_stock = BuyStockOrder(stock)
    sell_stock = SellStockOrder(stock)

    # invoker
    broker = Broker()
    broker.add_order(buy_stock)
    broker.add_order(sell_stock)

    broker.place_order()
"""
buy stock
sell stock
"""

1、A股利润表,资产负债表,现金流量表补全2019年一季度数据
3、查找融资历史中异常数据,发现500多条阶段重复的数据,运营单独处理
4、A股、港股公开发行阶段不显示,和del项目处理 修复后观察下 最后上市时间为:2019.06.18
5、处理港股报告大小,统一修改为字节存储涉及表 mf_hk_prospectus

TODO:
1、修复 港股历史报告 ganggu_history_reports 301
2、修复 港股所有公告 ganggu_reports 302
2、港股公司名 -B 这种就去掉这个小尾巴(后面处理,数据可能会重复)