1. 程式人生 > >Python設計模式(四) -- 模板方法模式

Python設計模式(四) -- 模板方法模式

模板方法模式

定義

定義了一個演算法的步驟,並允許子類別為一個或多個步驟提供其實踐方式。讓子類別在不改變演算法架構的情況下,重新定義演算法中的某些步驟

適用場景:

  • 事務處理的步驟具有共性,只是具體實施,根據處理步驟中的實現的方法產生差異化。

案例

  • 單據分別為銷售單據庫存單據。單據內容各有不同。
  • 單據具有共同的步驟:
Created with Raphaël 2.1.0請求儲存單據檢測單據必填項檢測唯一項是否存在重複值將請求資料儲存到資料庫儲存單據成功
  • 但是每個單據中需要檢測的必填項又不相同。其中庫存單據的唯一項是由系統生成*,不需要使用者填寫,無需檢測

實施

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#######################################################
#    
#    檔名 :   model_function.py
#    作者   :   WangYi
#  電子郵箱 :   [email protected]
#    日期   :   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}

相關推薦

Python設計模式() -- 模板方法模式

模板方法模式 定義 定義了一個演算法的步驟,並允許子類別為一個或多個步驟提供其實踐方式。讓子類別在不改變演算法架構的情況下,重新定義演算法中的某些步驟 適用場景: 事務處理的步驟具有共性,只是具體實施,根據處理步驟中的實現的方法產生差異

Head First設計模式模板方法模式

names 去除 缺點 ide 個數 write ima 父類 public 一、定義 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變算法結構的情況下,重定義該算法中的某些特定步驟。 比較通俗的說法,子類決定如何實現算法中的某些步驟,比如兩

java設計模式模板方法模式

java 設計模式宋丹丹姐的一個小品,說把大象放入冰箱分為幾步驟,三步、第一步:把冰箱門打開,第二步:把大象裝進去,第三步:把冰箱門關上。就是這樣的一個小品,可以說是其實簡化的一個模板方法。把雞蛋裝進冰箱分為幾步,同樣也是這個道理。模板方法模式概念:把一些共同的行為抽象出來,作為父類公共使用,一些具體的步驟

23種設計模式模板方法模式

技術分享 cnblogs ati strac void package com rim div 模板方法模式(TemplateMethod):定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

設計模式模板方法模式

nbsp outline 依次 print 繪畫 false 鉤子方法 註意 div (文章的部分內容參考了《設計模式之禪》一書,大家也可以讀讀看,內容寫的非常好) 什麽是模板方法模式 它的定義如下: 定義一個操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變

再起航,我的學習筆記之JavaScript設計模式17(模板方法模式)

方法 album asc pac uid java 起航 hub pic http://pic.cnhubei.com/space.php?uid=4614&do=album&id=1392753http://pic.cnhubei.com/space.ph

C#設計模式之行為類模式模板方法模式

frame 應該 ocp 方式 src 代碼復用 操作 優缺點 sse 定義(Template Method) 定義一個操作中算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 啟示 組裝電腦一般包含三個部分,主機、顯示

GOF23設計模式模板方法模式(template method)

評分 end 抽象方法 abs 方法調用 轉移 pri spa 應用 一、模板方法模式概述   模板方法模式是編程中經常使用的模式。它定義了一種操作中的算法架構,將某些步驟延遲到子類中實現。這樣,新的子類可以在不改變一個算法結構的前提下重新定義該算法的某些特定步驟。   (

設計模式模板方法模式(TemplateMethod)

pla AR 應用 blog public ood 操作 () eal 模板方法模式使用繼承來實現模式的功能,在基類使用一個方法來定義算法的各個步驟,這些步驟(方法)的具體實現會放到子類中,通過這樣來實現不同算法對象的算法拼合,完成該對象整體算法的實現。 作用 模板方法

“Head First 設計模式“ :模板方法模式

設計模式 模板方法模式 模板方法 模板方法模式 定義:模板方法模式在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。模板方法就是一個固定步驟的“算法”骨架方法。這個算法的可變部分通過繼承,在子類中重載實現。這樣就可以

設計模式的藝術 行為型模式模板方法模式

前言 生活中有許多事情可以理解成分步驟執行的東西,比如請客吃飯,無論吃什麼,一般都包含著點單,吃東西,買單幾個步驟,不論吃麵還是吃大餐,其他步驟不會變,最多變變點單,在軟體開發中,也會有類似的情況出現,我們可以有個點單的基類,然後子類裡面具體實現是吃麵還是點大餐,這就是模板方法模式,這種模式利用

Java進階篇設計模式之十一 ---- 策略模式模板方法模式

前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Strategy Pattern)和模板模式(Mediator Pattern)。 策略模式 簡介 策略模式(Stra

JAVA設計模式模板方法模式和建造者模式

一、前期回顧 上一篇《Java 設計模式之工廠方法模式與抽象工廠模式》介紹了三種工廠模式,分別是工廠方法模式,簡單工廠方法模式,抽象工廠模式,文中詳細根據實際場景介紹了三種模式的定義,實踐,最後總結了三種方式的區別,以及各個模式的適用場景。這一篇博文我們來學習下模板方法模式和建造者模式。

java常用設計模式8——模板方法模式

這個設計模式應該是最簡單的設計模式,因為大家平時都在使用,可能只是不知道它還是個設計模式吧 相關程式碼下載: GitHub - GodisGod/DesignPatternStudy: 設計模式學習demo https://github.com/GodisGod/Desi

設計模式模板方法模式

模式定義 模板方法模式在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變演算法結構的情況下,重新定義演算法中的某些步驟。 下圖是該模式的類圖: 一個生動的例子 模板類: public abstract class CaffeineBe

每天學點設計模式之---模板方法模式

模板方法模式的定義理解: 模板方法:父類中定義好演算法的的完整執行框架,子類根據自身需求實現具體的演算法步驟; 比如珍珠奶茶的製作流程,可以總結出一套固定的執行流程, 1.先準備一杯清水河一個塑料杯子 2.在準備好的塑料杯中新增珍珠奶茶需要的原

Android原始碼設計模式模板方法模式

在面向物件開發中,通常會遇到這樣一個問題,我們知道一個演算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的,例如,執行程式的流程大致如下: 1.檢查程式碼的正確性; 2.連結相關的類庫; 3.編譯相關的程式碼;

設計模式模板方法模式(行為型)

目錄 一、模式定義 二、模式角色 三、模式分析 四、具體例子 五、模式應用場景 一、模式定義 模板方法模式就是在一個抽象類中定義一些骨架方法,然後通過類繼承的方法,將一些方法延遲到繼承類裡。模板方法模式是一種類行為型模式,是一種比較常用的方法。不屬於物件行為型模式,因為只是通過

Java設計模式模板方法模式(Template Method)

本文繼續介紹23種設計模式系列之模板方法模式。概述模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法

設計模式模板方法模式-template method

定義一個操作中的演算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟 在抽象父類中,可以定義多種不同型別的方法,如下: 呼叫基本