模板方法模式

定义

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

适用场景:

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

案例

  • 单据分别为销售单据库存单据。单据内容各有不同。
  • 单据具有共同的步骤:
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):"""检测单据必填项"""passdef _check_unique_item(self, **kwargs):"""检测唯一项"""passdef _create_invoice(self, **kwargs):"""创建单据"""passdef 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}

Python设计模式(四) -- 模板方法模式相关推荐

  1. 细说Python设计模式之模板方法模式(封装算法)

    文章目录 定义模板方法模式 适用场景 日常例子理解该模式 了解模板方法设计模式 模板方法模式的UML类图 现实中的模板方法模式 模板方法模式--钩子 好莱坞原则与模板方法 模板方法的优缺点 问答 定义 ...

  2. Python设计模式之模板方法模式实例详解

    1.模板方法模式定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 子类实现的具体方法叫作基本方法,实现对基本方法高度的框 ...

  3. 设计模式之模板方法模式详解

    设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...

  4. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. 【设计模式】模板方法模式(C#)

    [设计模式]模板方法模式 1.概述 背景 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某 ...

  6. Carson带你学设计模式:模板方法模式(Template Method)

    前言 今天Carson来全面总结最常用的设计模式 - 模板方法模式. Carson带你学设计模式系列文章 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南 Carson带你 ...

  7. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  8. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  9. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

最新文章

  1. C#中的预编译指令介绍
  2. 场景法设计测试用例atm_测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等...
  3. 替换IP java代码
  4. 用计算机KADIO算方差,KADIO计算器怎样算方差
  5. 财付通接口(asp)
  6. “软件宝宝”出生前,安全系列文章(一)
  7. Original error was: DLL load failed while importing _multiarray_umath: 找不到指定的模块
  8. 使用C#读写ini配置文件
  9. python:输出10行的杨辉三角 - 二项式的n次方展开系数
  10. 计算机自带的游戏怎么找xp,教你怎样查询Windows XP/Windows 7自带系统游戏路径
  11. zoj2100-Seeding
  12. DoIP的基本信息(一)
  13. r语言实现sem_利用R语言做结构方程模型分析
  14. 计算机多媒体论文摘要,急需一篇计算机多媒体论文
  15. matlab 儒略历 函数,儒略日(儒略日 在线计算器)
  16. python学习笔记3.5-with的妙用
  17. 【哲学心理学】何为占有欲?何为真爱?
  18. 人工智能竞赛:从硅谷到北京,巨头们严阵以待
  19. 10个不常见但十分有用的网站,建议每个人都收藏
  20. 金蝶kis标准版如何修改服务器地址,金蝶kis怎么设置服务器地址

热门文章

  1. matlab 画多个箱线图
  2. Detecting Faces in Images: A Survey( 翻译)
  3. 出栈顺序(栈和队列)B
  4. 04Java异常-3. 异常处理方式之try..catch
  5. NTFS文件系统USN日志
  6. JAVA-【1】配置
  7. 今天凌晨,AWS一口气又双叒叕发布了N个新服务
  8. Cute Http File Server(chfs)轻量网盘及webdav部署指南
  9. 伪NMOS的基本特点
  10. 天梯赛省赛选拔赛复盘