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}
发布了5 篇原创文章 · 获赞 2 · 访问量 5083
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览