1. 程式人生 > >設計模式之Template Method模式

設計模式之Template Method模式

       Template Method模式,模板方法模式。顧名思義,其定義就是在父類中定義處理流程的框架,在子類中實現具體的處理方式。先直接上程式碼,然後我們再來討論這種模式。現在的大概需求是這樣的。
傳入一個char型'A',列印如下結果:


輸入“Hello World !”打印出如下結果:

在設計模式中我們用到的例子都是一些很簡單的例子,主要闡述的是一種思想,然後在自己的專案中用上,為自己帶來便利。

       首先來看看思路:先找出需求對我們行為的要求是啥?打印出一些特殊的字元,或者字串。可以看出來輸入的'A'和'Hello World !'都被迴圈列印了5遍,在列印之前和之後都有別的處理,但是字元和字串列印之前和列印之後的處理卻明顯不一樣,並且字串列印的時候,很明顯增加了這個玩意兒'|'。那大體的流程就有了,在列印之前呼叫一個方法open,然後寫一個for迴圈去列印字元和字串,最後在呼叫一個close方法作為結束的處理。對應成程式碼就是下面醬紫的。

      先定義一個基類AbstractDisplay,在該方法中共第一四個方法open,close,print,display。首先open,close,print這三個方法是抽象方法,並未去實現,只是規定了行為。具體怎麼做交給子類,自由發揮。display方法則是將子類都要做的流程直接寫出來以便子類都能用,不用在每一個子類中都去寫重複的程式碼。

/**
 * Created by PICO-USER Dragon on 2017/3/9.
 */
public abstract class AbstractDisplay {

    protected abstract void open();

    protected abstract void 
close(); protected abstract void print(); public final void display() { open(); for (int i = 0; i < 5; i++) { print(); } close(); } }
      接著需要先定義一個CharDisplay類繼承於AbstractDisplay類,具體實現父類的抽象方法。做自己想要做的動作。
/**
 * Created by PICO-USER on 2017/3/9.
*/ public class CharDisplay extends AbstractDisplay { private char charA; public CharDisplay(char charA) { this.charA = charA; } @Override public void open() { System.out.print("<< "); } @Override public void close() { System.out.print(" >>\n"); } @Override public void print() { System.out.print(charA); } }
還有一個StringDisplay子類,跟CharDisplay類大同小異。
/**
 * Created by PICO-USER on 2017/3/9.
 */
public class StringDisplay extends AbstractDisplay {

    private String string;

    public StringDisplay(String string) {

        this.string = string;

    }


    @Override
public void open() {

        System.out.print("+");
        for (int i = 0; i < 15; i++) {

            System.out.print("-");
        }
        System.out.print("+\n");

    }

    @Override
public void close() {

        open();

    }

    @Override
public void print() {

        System.out.print("| " + string + " |\n");

    }
}
最後就是主方法呼叫了。
public class TemplateMethod {

    public static void main(String[] args0) {

        AbstractDisplay charDisplay = new CharDisplay('A');
        AbstractDisplay stringDisplay = new StringDisplay("Hello World !");
        charDisplay.display();
        stringDisplay.display();
    }
}
      好了,到這兒程式碼就完了。開篇已經很清楚的說明了該設計模式的思想,現在我們來說一些細節的東西。

      請注意看display這個方法,這個方法是被final修飾的,為啥用他修飾呢?在里氏替換原則中第一條就是子類可以實現父類的抽象方法,但是不能修改父類的抽象方法,這兒display雖然不是抽象方法,但是他卻是子類中公用的一個方法,約定了這種行為,子類就不能對這種行為進行修改,所以用final修飾,不讓子類重寫該方法。

public final void display()

       再看TemplateMethod類中呼叫display方法的程式碼,這兒是用的父類AbstractDisplay來呼叫,而不是StringDisplay,為什麼這麼做呢?這是為了保證子類和父類的一致性。即是沒有instanceof等指定子類的種類,程式也能正常使用。這就是里氏替換原則中說到的無論在父型別中儲存那個子類的例項,程式都能正常的工作。

AbstractDisplay stringDisplay = new StringDisplay("Hello World !");
                stringDisplay.display();

現在有一個問題:我們能不能用介面去代替AbstractDisplay?答案是:不可以,因為我們這種模式的側重點在於由父類決定處理流程,這處理流程display方法必須要在父類中去實現,但是介面是不能去實現方法的。

好了到這兒,我們這篇文章就算是完了。那我們Template Method模式的具體有電體現在哪兒呢?
那就是我們不需要在每一個子類中去寫display方法的處理流程,這樣在以後這個功能出現bug或者需要修改的時候,我們不需要到處找子類去修改,只要修改父類中的這個方法即可。

相關推薦

設計模式Template Method模式

       Template Method模式,模板方法模式。顧名思義,其定義就是在父類中定義處理流程的框架,在子類中實現具體的處理方式。先直接上程式碼,然後我們再來討論這種模式。現在的大概需求是這樣的。 傳入一個char型'A',列印如下結果: 輸入“Hello Wo

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

本文介紹設計模式中的模板方法(Template Method)模式的概念,用法,以及實際應用中怎麼樣使用Template Method模式進行開發。Template Method模式的概念 Template Method模式正如其名,在作為抽象類的父類裡,定義了一個具有固定演算法並可以細分為多個步驟的模板方法

設計模式Template Method模式

Template Method模式——將具體處理交給子類 Template Method 模式是帶有模板功能的模式,組成模板的方法被定義在父類中。由於這些方法是抽象方法,所以只檢視父類的程式碼是無法知道這些方法最終會進行何種具體處理的,唯一能知道的就是父類是如

設計模式攻略】建立型模式Factory method模式

之前討論過行為型模式之一的Template method模式,而Factory method模式其實是Template method模式在Factory場景(建立物件)下的一種應用形式。對Template method模式的定義是在基類中為演算法框架定義方法,通過該方法去呼叫子類中封裝的演算法各個步驟的具體實

操作型模式Template Method(模板方法)模式

1.如果你期望在一個方法中實現一個演算法,把演算法中的某些步驟的定義推遲到子類中去重新定義,可使用Template Method(模板方法)模式 2.舉例 //演算法框架抽象類 public abstract class AbstractMethod {

Strategy模式Template Method模式的異同淺析

一、Strategy模式 1. 特點說明: 定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換。適用場景: 許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。需要使用一個演算法的不同變體。演算法使用客戶不應該知道的資料。使用

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

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

C#設計模式十三模板方法模式Template Method Pattern)【行為型】

並集 client 變化 args 集中 pac 爸爸 rim 自己 原文:C#設計模式之十三模板方法模式(Template Method Pattern)【行為型】一、引言 “結構型”的設計模式已經寫完了,從今天我們開始講“行為型”設計模式。現在我們開始講【行為型】設

Java設計模式從[歡迎介面]分析模板方法(Template Method)模式

  模板方法是在抽象類中最常用的模式了(應該沒有之一),它定義一個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構即可重新定義演算法的某些步驟。   例如我們要編寫一個歡迎介面,如果使用者是第一次開啟本軟體,則彈出一個歡迎的提示。為了能夠實現

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

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

面向物件設計模式---模板方法模式(Template Method Pattern)

這幾天遇到了一些事,生活中有太多的不確定性,我所能做的就是做最好的自己。爭取能把這本《大話設計模式》的讀書筆記做完吧,說真的雖然現在只是Cover到知識點,還並沒有實戰,不過我想這就是一種積累。就像之前剛閱讀完的《深入淺出MySQL》高階部分一樣,雖然蠻多還是看不懂,畢竟我不是專

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

            本來打算按照書上的講的設計模式一個一個學下來,但是讀spring原始碼的時候遇到模板方法模式,不懂,就提前先學一下。 模板方法模式就是定義一個演算法執行的骨架,而具體的演算法被延遲到子類中去實現,在spring中很多地方都使用到了模板方法模式,比如s

JAVA設計模式 模板方法模式Template Method Pattern】

一、概述     定義一個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。它是一種類行為型模式。 二、適用場景     適用於對一些複雜的操作/演算法進行步驟分割、抽取公共部分由抽象父類實現

設計模式(22)--Template Method(模板方法模式)--行為型

fur cli 由於 temp img style spa ted prop 1.模式定義:   模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些

GoF模板方法模式Template Method

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

c#設計模式系列:模板方法模式Template Method Pattern)

出了 strong view crete question ron 屬於 png 過多 引言 提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更

設計模式工廠方法模式(Factory Method Pattern)

2. 工廠方法模式(Factory Method Pattern) 目錄 工廠方法模式(Factory Method Pattern) 模式動機 模式定義 模式結構 時序圖 程式碼分析 模式分析 例項

[設計模式] - No.6 Template Method 模式

Template Method顧名思義,就是說父類在其內部定義了一些抽象函式,然後定義了一個模板方法,並在模板方法中呼叫了這些抽象方法。父類在模板方法中定義了某個功能處理流程的框架,而子類則實現具體的處理。這個例子非常簡單,其核心的理念就是使邏輯處理通用化。 我們通過書中的一個簡單的

設計模式3.Template Method(模板方法)

設計模式目的: 模板方法,在父類中定義好演算法步驟順序,將演算法中的某一具體部分延遲到子類中實現,使得可以在不改變演算法的前提下,將體重特定的部分改變實現。 XML類圖: 模式核心概述: 從模式描述中就能知道,模板方法模式的類圖很簡單,僅涉及到父類

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

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