模板方法模式
定义
定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤
适用场景:
- 事务处理的步骤具有共性,只是具体实施,根据处理步骤中的实现的方法产生差异化。
案例
- 单据分别为
销售单据
、库存单据
。单据内容各有不同。 - 单据具有共同的步骤:
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}