GOF設計模式 物件行為型模式 模板模式

2021-09-25 18:55:47 字數 3585 閱讀 5750

在現實生活中,很多事情都包含幾個實現步驟,例如請客吃飯,無論吃什麼,一般都包含點 單、吃東西、買單等幾個步驟,通常情況下這幾個步驟的次序是:點單 --> 吃東西 --> 買單。 在這三個步驟中,點單和買單大同小異,最大的區別在於第二步——吃什麼?吃麵條和吃滿 漢全席可大不相同。

在軟體開發中,有時也會遇到類似的情況,某個方法的實現需要多個步驟(類似「請客」),其 中有些步驟是固定的(類似「點單」和「買單」),而有些步驟並不固定,存在可變性(類似「吃 東西」)。為了提高**的復用性和系統的靈活性,可以使用一種稱之為模板方法模式的設計 模式來對這類情況進行設計,在模板方法模式中,將實現功能的每乙個步驟所對應的方法稱 為基本方法(例如「點單」、「吃東西」和「買單」),而呼叫這些基本方法同時定義基本方法的執 行次序的方法稱為模板方法(例如「請客」)。在模板方法模式中,可以將相同的**放在父類 中,例如將模板方法「請客」以及基本方法「點單」和「買單」的實現放在父類中,而對於基本方 法「吃東西」,在父類中只做乙個宣告,將其具體實現放在不同的子類中,在乙個子類中提 供「吃麵條」的實現,而另乙個子類提供「吃滿漢全席」的實現。通過使用模板方法模式,一方面 提高了**的復用性,另一方面還可以利用物件導向的多型性,在執行時選擇一種具體子 類,實現完整的「請客」方法,提高系統的靈活性和可擴充套件性。

模板方法模式:定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模 式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。

模板方法模式是一種基於繼承的**復用技術,它是一種類行為型模式。

模板方法模式是結構最簡單的行為型設計模式,在其結構中只存在父類與子類之間的繼承關 系。通過使用模板方法模式,可以將一些複雜流程的實現步驟封裝在一系列基本方法中,在 抽象父類中提供乙個稱之為模板方法的方法來定義這些基本方法的執行次序,而通過其子類 來覆蓋某些步驟,從而使得相同的演算法框架可以有不同的執行結果。模板方法模式提供了一 個模板方法來定義演算法框架,而某些具體步驟的實現可以在其子類中完成。

模式結構

模板方法模式結構比較簡單,其核心是抽象類和其中的模板方法的設計,其結構如圖所示:

模板方法模式包含如下兩個角色:

(1) abstractclass(抽象類):在抽象類中定義了一系列基本操作(primitiveoperations),這些基 本操作可以是具體的,也可以是抽象的,每乙個基本操作對應演算法的乙個步驟,在其子類中 可以重定義或實現這些步驟。同時,在抽象類中實現了乙個模板方法(template method),用於 定義乙個演算法的框架,模板方法不僅可以呼叫在抽象類中實現的基本方法,也可以呼叫在抽 象類的子類中實現的基本方法,還可以呼叫其他物件中的方法。

(2) concreteclass(具體子類):它是抽象類的子類,用於實現在父類中宣告的抽象基本操作 以完成子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。

應用舉例:

車的啟動到停止的過程

一台鈴木的小車鋒馭和一台鈴木的電單車風暴1000,我要想把這兩種型別的車都先跑起來再停下來,有一些步驟,並且這些步驟是有先後順序的,那就是:

1. 開啟車門

2. 啟動發動機

3. 掛檔

4. 走起

5. 剎車

6. 停車

模板抽象類

package com.singland.dp.template;

public abstract class drivetemplate

protected abstract void opendoor();

protected void startengine()

protected abstract void gear();

protected void go()

protected abstract void brake();

protected void stop()

}

小車鋒馭的實現

package com.singland.dp.template;

public class suzukiscross extends drivetemplate

@override

protected void gear()

@override

protected void brake()

}

電單車風暴1000的具體實現

package com.singland.dp.template;

public class suzukistrom1000 extends drivetemplate

@override

protected void gear()

@override

protected void brake()

}

客戶端的測試**就很簡單了

package com.singland.dp.template;

import org.junit.test;

public class mytest

}

執行結果:

模板方法模式效果與適用場景

模板方法模式是基於繼承的**復用技術,它體現了物件導向的諸多重要思想,是一種使用 較為頻繁的模式。模板方法模式廣泛應用於框架設計中,以確保通過父類來控制處理流程的 邏輯順序(如框架的初始化,測試流程的設定等)。

5.1 模式優點

模板方法模式的主要優點如下:

(1) 在父類中形式化地定義乙個演算法,而由它的子類來實現細節的處理,在子類實現詳細的處理演算法時並不會改變演算法中步驟的執行次序。

(2) 模板方法模式是一種**復用技術,它在類庫設計中尤為重要,它提取了類庫中的公共行 為,將公共行為放在父類中,而通過其子類來實現不同的行為,它鼓勵我們恰當使用繼承來 實現**復用。

(3) 可實現一種反向控制結構,通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執 行。

(4) 在模板方法模式中可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的 不同實現,更換和增加新的子類很方便,符合單一職責原則和開閉原則。

5.2 模式缺點

模板方法模式的主要缺點如下:

需要為每乙個基本方法的不同實現提供乙個子類,如果父類中可變的基本方法太多,將會導 致類的個數增加,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。

5.3 模式適用場景

在以下情況下可以考慮使用模板方法模式:

(1) 對一些複雜的演算法進行分割,將其演算法中固定不變的部分設計為模板方法和父類具體方 法,而一些可以改變的細節由其子類來實現。即:一次性實現乙個演算法的不變部分,並將可 變的行為留給子類來實現。

(2) 各子類中公共的行為應被提取出來並集中到乙個公共父類中以避免**重複。

(3) 需要通過子類來決定父類演算法中某個步驟是否執行,實現子類對父類的反向控制。

設計模式 行為型模式

行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。由於組合關係或聚合關係比繼承關係耦合度低...

命令模式 物件行為型模式

一 意圖 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化 對請求排隊或記錄請求日誌,以及支援可撤銷操作。二 適用性 當有以下需求時,可使用command模式 三 結構 四 public class receiver public inte ce command public cla...

設計模式(結構型模式 行為型模式)

一 結構型模式 1.介面卡模式 通過乙個具體類把適配者適配到目標介面中,使得原本不相容的那些類可以一起工作。舉個例子 可以把二分查詢和快排 適配者 封裝到乙個dataoperation 目標介面 介面中,再操作adapter 介面卡 來進行操作。adapter quicksort sortobj,b...