Python设计模式(四) -- 模板方法模式
来源:互联网 发布:马鞍山网络大学招聘 编辑:程序博客网 时间:2024/06/05 18:45
模板方法模式
定义
定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤
适用场景:
- 事务处理的步骤具有共性,只是具体实施,根据处理步骤中的实现的方法产生差异化。
案例
- 单据分别为
销售单据
、库存单据
。单据内容各有不同。 - 单据具有共同的步骤:
- 但是每个单据中需要检测的必填项又不相同。其中库存单据的唯一项是由系统生成*,不需要用户填写,无需检测。
实施
#!/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}
2 0
- Python设计模式(四) -- 模板方法模式
- 四 设计模式之模板方法模式
- 设计模式(四)---模板方法模式
- 设计模式之四:模板方法模式
- 设计模式之四:模板方法模式
- python设计模式之模板方法模式
- 设计模式-模板方法模式-template-python
- python设计模式之模板方法
- python设计模式之模板方法
- 设计模式介绍之四:模板方法(Template Method)模式
- Java设计模式(四) 之 模板方法模式
- 设计模式:模板方法模式
- 设计模式 - 模板方法模式
- 设计模式:模板方法模式
- 设计模式 模板方法模式
- 设计模式--模板方法模式
- 设计模式-【模板方法模式】
- 设计模式: 模板方法模式
- oracle视图、列转行、前几个月、相差秒数、自增主键
- 【JavaScript】3.语法
- uboot的几种启动方式的配置方法。
- 使用PHP访问RabbitMQ消息队列
- 深入分析Java ClassLoader原理
- Python设计模式(四) -- 模板方法模式
- 递归,递推,迭代区别:
- Friends
- HTTP/1.1 协议Expect: 100-continue
- Python并发编程eventlet
- "Accordian" Patience UVA
- IntelliJ IDEA乱码调整
- Fragment的懒加载
- Linux进程中task_struct结构体