1. 程式人生 > >模版方法(Template Method)

模版方法(Template Method)

“元件協作”模式:

  • 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,使二者之間協作時常用的模式。
  • 典型模式
    • Template Method
    • Strategy
    • Observer / Event

Template Method

定一個操作中的演算法的骨架(穩定的),而將一些步驟延遲(容易變化的)到子類中。Template Method使得子類可以不改變(複用)一個演算法的結構即可重新定義(Override覆寫)該演算法的某寫特定步驟
——《設計模式(GoF)》

動機(Motivation)

  • 在軟體構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架與應用之間的關係)而無法和任務的整體結構同時實現。
  • 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?

例子:下面的偽碼主要是有兩個開發人員來構成的程式碼,分別是庫開發人員和應用程式的開發人員。對於庫的開發人員來說,已經開發完成了所需要功能的1、3、5三個步驟;而如果要實現這個完整功能,需要應用程式的開發人員實現其中的2和4這兩步。同時,還需要應用程式的開發者,在使用的時候,依次來呼叫庫和自己開發的這幾個函式。

//程式庫開發人員
class Library{
 
public:
    void Step1(){
        //...
    }
 
    void Step3(){
        //...
    }
 
    void Step5(){
        //...
    }
};
 
//應用程式開發人員
class Application{
public:
    bool Step2(){
        //...
    }
 
    void Step4(){
        //...
    }
};
 
int main()
{
    Library lib();
    Application app();
 
    lib.Step1();
 
    if (app.Step2()){
        lib.Step3();
    }
 
    for (int i = 0; i < 4; i++){
        app.Step4();
    }
 
    lib.Step5();
 
}


問題:

  1. 首先,對應用程式的開發人員來說,他需要自己開發其中的第二和第五步的函式的開發。對於應用程式的開發者來說,要求是比較高的,必須對庫中的函式情況比較瞭解,重寫的兩個函式的難度也相對較大,對於函式整體執行流程也不被庫函式的開發人員所控制。
  2. 最關鍵的問題,庫開發人員和應用程式的開發人員所開發的內容的耦合度很高,彼此相互交織在一起,還需要由用開發人員來組織整體呼叫流程。未來程式的擴充套件性和可維護性的難度都比較大。

解決辦法:

//程式庫開發人員
class Library{
public:
    //穩定 template method
    void Run(){
 
        Step1();
 
        if (Step2()) { //支援變化 ==> 虛擬函式的多型呼叫
            Step3(); 
        }
 
        for (int i = 0; i < 4; i++){
            Step4(); //支援變化 ==> 虛擬函式的多型呼叫
        }
 
        Step5();
 
    }
    virtual ~Library(){ }
 
protected:
 
    void Step1() { //穩定
        //.....
    }
    void Step3() {//穩定
        //.....
    }
    void Step5() { //穩定
        //.....
    }
 
    virtual bool Step2() = 0;//變化
    virtual void Step4() =0; //變化
};
 
//應用程式開發人員
class Application : public Library {
protected:
    virtual bool Step2(){
        //... 子類重寫實現
    }
 
    virtual void Step4() {
        //... 子類重寫實現
    }
};
 
int main()
    {
        Library* pLib=new Application();
        lib->Run();
 
        delete pLib;
    }
}



在第一種實現中Application呼叫Library,是一種早繫結。而在第二種方法中,Library呼叫Application,實現的是一種晚繫結。耦合性相對也很低,庫的開發人員完全不需要管應用開發人員的開發情況,可以獨立完成自己的開發任務。對於應用程式的開發人員來說,只需要用簡單的應用即可,而不需要考慮其中具體的實現過程。所以這樣的設計方法的耦合性較低。

注意:對於Template Method來說,有一個前提,就是Run()方法必須要是穩定的。如果Run()不穩定,那麼沒有一個穩定的軟體的骨架,就不存在這樣一種設計模式。假定,所有方式都是穩定,那麼其實也沒有必要使用設計模式。

要點總結:

  1. Template Method是一種非常基礎性的設計模式,在面向物件的系統中,有著大量的應用。他用最簡潔的機制(虛擬函式的多型性)為很多應用程式的框架提供了靈活的擴充套件點,是程式碼複用方面的基本實現結構。
  2. 除了可以靈活對應子步驟的變化外,“不要呼叫我,讓我來呼叫你”的反向控制結構是Template Method的典型應用。
  3. 在具體實現方面,被Template Method呼叫的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),一般推薦將他們設定為protected方法。

相關推薦

模版方法Template Method

“元件協作”模式: 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,使二者之間協作時常用的模式。 典型模式 Template Method Strategy Observer / Eve

.NET設計模式-模版方法Template Method

摘要:Template Method模式是比較簡單的設計模式之一,但它卻是程式碼複用的一項基本的技術,在類庫中尤其重要。主要內容1.概述2.Template Method解說3..NET中的Template Method模式4.適用性及實現要點概述變化一直以來都是軟體設計的永恆話題,在XP程式設計中提倡擁抱變

設計模式的征途—17.模板方法Template Method模式

opened res ati 相同 rom 配置 version factor creat 在現實生活中,很多事情都需要經過幾個步驟才能完成,例如請客吃飯,無論吃什麽,一般都包含:點單、吃東西、買單等幾個步驟,通常情況下這幾個步驟的次序是:點單=>吃東西=>買單

【java設計模式】之 模板方法Template Method模式

1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基本功能即可,不考慮擴充套件性,那你會怎麼做呢?我們首先會根據經驗設計一個類圖:        由這個類圖可知,非

【設計模式】之模板方法Template Method

模板方法的定義為:再一個操作中定義一個演算法的骨架,將演算法中的一些步驟延遲到子類去實現。模板方法允許子類在不該變演算法結構的情況下重新定義演算法的某些步驟。 Define the skeleton of an algorithm in an operation, defe

【為什麼學習模板方法Template Method模式和模板方法Template Method模式主要解決的問題】

轉載 https://blog.csdn.net/eson_15/article/details/51323902 1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基

C++設計模式——模板方法Template Method

模板方法(template method)設計模式用於定義一個包含許多步驟的演算法框架,允許子類重寫(覆蓋)演算法的某一個步驟而不改變演算法整體的流程和框架。 模板方法提供的流程是骨架,子類無須覆蓋模板方法本身,只需繼承即可,即模板方法無須是 virtu

模板方法模式Template Method

student 客戶 args 提高 prepare sid 行為 right 調用 定義: 定義一個模板結構,將具體內容延遲到子類去實現。 解決的問題: 提高代碼復用性。將相同部分的代碼放在抽象的父類中,而將不同的代碼放入不同的子類中 實現了反向控制。通

GoF之模板方法模式Template Method

釋放 wid 情況 gpo 在線遊戲 一點 需要 eth inf 定義:   在一個操作方法中定義算法的流程,其中這些步驟由子類完成。模板方法模式讓子類 在不變更原有算法流程的情況下,能夠重新定義其中的步驟。   上述的定義中包含兩個方面:     定義一個算法的流程,即是

GOF23設計模式之模板方法模式template method

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

Java設計模式之一——模板方法設計模式Template Method

設計原則:不要重複 DRY(Don’t Repeat Yourself,不要複製自己) OAOO(Once and Only once,僅此一次):避免程式碼重複 GOF給出的模板方法模式定義如下: Define the skeleton of an algorith

Java23種設計模式【19】----》模板方法模式template method

一、場景 流程骨架清楚,但具體實現還不清楚 如吃飯,吃飯流程都知道,但具體吃什麼飯不清楚 二、模板方法模式介紹 定義好骨架,但具體某個方法該怎麼調不知道 三、核心 四、方法回撥(鉤子方法) 五、什麼時候用模板方法模式 六、開發中的場景 七

模板方法模式 template Method

這種設計模式在Junit中被使用,如setUp方法與tearDown方法,在JUnit中規定了先執行setUp後執行tearDown但是沒有規定具體執行內容 //在抽象類中可以規定模板方法的執行順序,在介面中不能 public abstract class Abstract

Java設計模式之模板方法模式Template Method

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

設計模式——模板方法模式Template Method

一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過呼叫抽象類,實現對子類的呼叫 就是在AbstractCalculator類中定義一個主方法

java模板方法設計模式Template Method

模板方法設計模式(Template Method):定義一個演算法骨架,而將一些步驟方法(方法沒必要一定是抽象的)延遲到子類中實現。該模式使得不同的子類可以不改變一個演算法的結構,只重定義該演算法的某些特定步驟方法。 舉個圖形例子: public class Test{

設計模式學習總結:模板方法模式Template Method

1.場景分析 茶和咖啡是兩種飲料,但是它們的沖泡方法十分相似,沖泡方法如下。 茶:把水煮沸->沸水浸泡茶葉->把茶倒進杯子->加檸檬 咖啡:把水煮沸->用沸水沖泡咖啡->把咖啡裝進杯子->加糖和牛奶 用程式碼來實現咖啡

Pandas學習筆記,字符串方法string method

api long top method hand capi borde tle row 一般語法格式Series.str.method()。具體方法見http://pandas.pydata.org/pandas-docs/stable/api.html#string-ha

設計模式-工廠方法Factory Method

log face inf str ace 對象實例 method tee 就是 2018-1-20 by Atlas 應用場景 Template Method Pattern是在父類建立處理邏輯的大綱骨架,而在子類補充具體的處理內容。把Template Method

設計模式2——建立型——工廠相關:簡單工廠Simple factory,工廠方法Factory method,抽象工廠Abstract factory

概要 這裡試圖描述23個設計模式中的兩個工廠(Factory)相關的設計模式:工廠方法(Factorymethod),抽象工廠(Abstract factory)。 注意點: 這兩個都屬於建立型設計模式。 由於這兩個設計模式都