Python设计模式(四) -- 模板方法模式

模板方法模式

定义

定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤

适用场景:

  • 事务处理的步骤具有共性,只是具体实施,根据处理步骤中的实现的方法产生差异化。

案例

  • 单据分别为销售单据库存单据。单据内容各有不同。
  • 单据具有共同的步骤:

Created with Raphaël 2.1.0 请求保存单据 检测单据必填项 检测唯一项是否存在重复值 将请求数据保存到数据库 保存单据成功

  • 但是每个单据中需要检测的必填项又不相同。其中库存单据的唯一项是由系统生成*,不需要用户填写,无需检测

实施

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#######################################################
# 
# 文件名 : model_function.py
# 作者 : WangYi
# 电子邮箱 : gzytemail@126.com
# 日期 : 2017/04/16 13:56:17
# 
# 描述 : 模板方法 
#


class AbstructInvoice(object):
    """ 单据模板 """
    def __init__(self):
        self.invoice_list = []

    def _check_input(self, **kwargs):
        """ 检测单据必填项 """
        pass

    def _check_unique_item(self, **kwargs):
        """ 检测唯一项 """
        pass

    def _create_invoice(self, **kwargs):
        """ 创建单据 """
        pass

    def save(self, **kwargs):
        """ 保存单据步骤 """
        self._check_input(**kwargs)
        self._check_unique_item(**kwargs)
        self._create_invoice(**kwargs)

    def show(self):
        """ 展示单据内容 """
        for index, content in enumerate(self.invoice_list):
            print("第%d条单据信息内容:%s" % (index, content))


class SaleInvoice(AbstructInvoice):
    """ 销售单据 """
    exist_number_list = []

    def _check_input(self, **kwargs):
        if not kwargs.get('name', None):
            raise ValueError(u"售后单据中客户姓名必填")
        if not kwargs.get('invoice_number', None):
            raise ValueError(u"售后单据中单据号必填")

    def _check_unique_item(self, **kwargs):
        invoice_number = kwargs.get('invoice_number', '')
        if invoice_number in self.exist_number_list:
            raise ValueError("invoice of sale repeat.")

    def _create_invoice(self, **kwargs):
        self.invoice_list.append({'name': kwargs.get('name', None), 
                                  'invoice_number': kwargs.get('invoice_number', None)})
        self.exist_number_list.append(kwargs.get('invoice_number', None))


class InventoryInvoice(AbstructInvoice):
    """ 库存单据 """
    def _check_input(self, **kwargs):
        if not kwargs.get('inventory', None):
            raise ValueError(u"库存单据中库存数量必填")
        if not kwargs.get('warehouse_name', None):
            raise ValueError(u"库存单据中仓库名称必填")

    def _create_invoice(self, **kwargs):
        self.invoice_list.append({'inventory': kwargs.get('inventory'),
                                  'warehouse_name': kwargs.get('warehouse_name')})


if __name__ == "__main__":
    paraments_1 = {'name': u'张三',
                   'invoice_number': u'Test0001'}
    s = SaleInvoice()
    # 插入一个销售单据
    s.save(**paraments_1) 

    # 重复插入一个销售单据
    try:
        s.save(**paraments_1) 
    except Exception as e:
        print e.message.encode()

    paraments_2 = {'inventory': 10,
                   'warehouse_name': u'测试仓'}
    i = InventoryInvoice()
    # 插入一条库存数据
    i.save(**paraments_2) 

    # 展示单据内容
    s.show()
    i.show()

结果

invoice of sale repeat.
第0条单据信息内容:{'invoice_number': u'Test0001', 'name': u'\u5f20\u4e09'}
第0条单据信息内容:{'warehouse_name': u'\u6d4b\u8bd5\u4ed3', 'inventory': 10}
    原文作者:Dear_Mr_Wang
    原文地址: https://blog.csdn.net/Dear_Mr_Wang/article/details/70196086
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞