GoF23設計模式 行為型設計模式 模板方法模式

2021-10-12 07:43:54 字數 2036 閱讀 9882

設計乙個系統,知道了演算法所需的關鍵步驟,而且明確這些步驟的執行順序,但某些步驟的具體實現未知,或者說某些步驟的實現與具體的環境有關,系統該如何設計?

1、去銀行辦理業務,一般有四個流程:取號、排隊、辦理具體業務、對工作人員進行評價。其中取號、排隊和對工作人員的評價是對每個客戶都是一樣的,辦理具體的業務不同(可能存款、取款、理財等)

2、生活中的規律:起床、吃飯、做事、睡覺。其中起床、吃飯、睡覺對每個人來說動作都是一致的,做事是不同的(可能上學、上班、運動等)

普通實現:可能在乙個類定義乙個方法,固定的流程直接操作,未知的用if語句去判斷,如下**,如果這麼操作,當新增新的操作,就要修改原來的**,不易操作和擴充套件(違法**開閉原則)

package com.project.templetemethod;

public class test

public void method(string type) else if("上班".equals(type)) //……

system.out.println("睡覺");

}}

使用模板方法模式實現:

1、定義抽象類/抽象模板(演算法的輪廓與骨架,乙個模板方法和若干個基本方法構成)

模板方法:按某種順序呼叫其包含的基本方法

基本方法:抽象方法(抽象類中宣告,由子類實現);具體方法(抽象類中已實現的方法);鉤子方法(抽象類中已實現的方法,包括用於判斷的邏輯方法和需要子類重寫的空方法)

package com.project.templetemethod;

public class testtemplatemethod

}//抽象模板方法

abstract class abstracttemplatemethod

templateexecute2(); }

//具體模板方法

private void templateexecute1()

//具體模板方法

private void templateexecute2()

//鉤子方法

protected boolean hookmethod()

//抽象方法,子類去實現

abstract void realexecute1() ;

abstract void realexecute2() ;

}//具體實現

class concreteclass extends abstracttemplatemethod

@override

void realexecute2()

//覆蓋鉤子

@override

protected boolean hookmethod()

}

模板方法模式需要注意抽象類與具體子類之間的協作。它用到了虛函式的多型性技術以及「不用呼叫我,讓我來呼叫你」的反向控制技術

1、演算法整體步驟固定,個別步驟具體實現易變,這時候實現模板方法,將易變的部分抽象出來,由子類實現

2、當多個子類有公共的行為時,可以將重複的行為提取到父類中,以避免**重複;識別**中的不同之處,並將不同之處分離成新的操作。新的模板方法替換這些不同的操作

3、當需要控制子類的擴充套件時,模板方法使用鉤子操作,定義子類是否執行該操作

乙個操作中的演算法骨架,將演算法的一些步驟延遲到子類中,使得子類可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。它是一種類行為型模式

優點:它封裝了不變部分,擴充套件可變部分。它把認為是不變部分的演算法封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件。

它在父類中提取了公共的部分**,便於**復用。

部分方法是由子類實現的,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。

缺點:對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,間接地增加了系統實現的複雜度。

父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了**閱讀的難度。

由於繼承關係自身的缺點,如果父類新增新的抽象方法,則所有子類都要改一遍。

GOF23 設計模式

design patterns elements of reusable object oriented software 即後述 設計模式 一書 由 erich gamma richard helm ralph johnson 和 john vlissides 合著 addison wesley,...

GoF23種設計模式

設計模式的經典名著 design patterns elements of reusable object oriented software,中譯本名為 設計模式 可復用物件導向軟體的基礎 的四位作者erich gamma richard helm ralph johnson,以及john vli...

GoF 23種設計模式

建立型模式 factory模式 abstractfactory模式 singleton模式 builder模式 prototype模式 結構型模式 bridge模式 adapter模式 decorator模式 composite模式 flyweight模式 facade模式 proxy模式 行為模式...