設計模式 模板方法模式

2021-08-08 08:33:52 字數 3539 閱讀 1089

個人部落格,想要搭建個人部落格的可以進來看看:

策略模式,在乙個方法中定義乙個演算法的骨架,而將一些具體的步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟

設計模式系列部落格**:

背景 , 我們的生活過程中,煮茶和咖啡的工作看起來不同,但是都可以分為下面4步,燒水,把茶或者咖啡放入水中,把咖啡或者水放到杯子中,加入調料,我們可以把公共的操作步驟提取出來放在抽象類中,不同的部分放在子類去實現

最使用模板方法中,只需要呼叫具體實現類的模板方法就可以

2.**

abstractclass

/**抽象父類*/

public

abstract

class

caffeinebeverage

//改變的部分讓子類去實現

abstract

void brew();

abstract

void addcondiments();

//固定的部分直接實現,使用private關鍵字讓外部無法呼叫

// final關鍵字是讓子類重寫改變這個方法

private

final

void

boilwater()

private

final

void

pourincup()

}

具體類

/**具體模板類,實現了tea特性的操作*/

public

class

teaextends

caffeinebeverage

@override

void addcondiments()

}//和上面相同

public

class

coffee

extends

caffeinebeverage

@override

void addcondiments()

}

測試main

public

class

main

}//結果

prepare the tea ...

boil the water

brew the tea

pour in cup

add lemon

prepare the coffee...

boil the water

brew the coffee

pour in cup

add sugar and milk

process finished with exit code 0

3.總結

4.模板方法模式中的鉤子

改進,使用鉤子hook(),在上面的背景例子中,咖啡和茶的都可以抽象為4個步驟,但是當存在一種例項只有3中步驟,比如可樂就不需要燒水操作,我們應該怎樣把他們統一到模板方法中,這個時候就可以使用鉤子了

改變抽象類方法

/**抽象父類*/

public

abstract

class

caffeinebeverage

brew();

pourincup();

addcondiments();

}//改變的部分讓子類去實現

abstract

void brew();

abstract

void addcondiments();

//固定的部分直接實現,使用private關鍵字讓外部無法呼叫

// final關鍵字是讓子類重寫改變這個方法

private

final

void

boilwater()

private

final

void

pourincup()

//-----changed-----不是final讓子類可以改變

private

boolean

isneedboilwater()

}

看了上面的**,應該對鉤子有了理解了,isneedboilwater()就是鉤子方法;當我們建立乙個模板方法時,如果子類必須實現的乙個方法就是有抽象方法,如果這個方法時可選的就使用鉤子

5.模板方法模式中的好萊塢原則

好萊塢原則 , 別呼叫我們,我們會呼叫你;高層元件呼叫底層元件,底層元件不要去呼叫高層元件

看起來很懵逼,不知道什麼意思。結合我們的模板方法模式來理解一下,我們的抽象父類(高層元件)呼叫了具體實現類(底層元件)的方法,這裡具體實現類實現了抽象方法,但是抽象具體類不可以呼叫抽象父類的方法

6.模板方法模式在jdk中的使用

我們都知道集合是我們常用的乙個類,大部分集合是可以排序的,比如說arraylist,可以對arraylist中的成員進行排序,但是不是每種儲存在arraylist中的類都可以排序的,可以排序的類必須實現了comparable介面(public int compareto(t o);唯一的方法),我們在使用double,integer中直接可以排序是因為這些類繼承了comparable介面的,可以去看看原始碼,這就是乙個模板方法模式的使用

/**繼承了comparable介面,duck類可以使用sort方法*/

public

class

duck

implements

comparable

@override

public

intcompareto(object o) else

if(this.weight == oduck.weight)else

}//重寫了tostring()後面的列印中使用

@override

public string tostring()

//測試main

public

static

void

main(string args)

//未排序前列印集合資訊

show(ducks);

system.out.println("\n\n");

//排序

collections.sort(ducks);

//排序後再次列印

show(ducks);

}//列印集合資訊

private

static

void

show(listlists)}}

模板設計模式 設計模式 模板方法模式

在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...

設計模式 模板方法設計模式

物件導向,萬物皆物件,用乙個雷來反應現實生活中的東西。比如銀行系統,業務公升級 活期 定期,差別很小,就加判斷 違背單一職責 差別比較多,尤其是模擬較複雜,型別拆分下。拆分之後,自然就有父類,重用。利率 每個客戶端都有利率,但是各不一樣 抽象方法。show 不分客戶端是一樣的,個別客戶端是不一樣的 ...

設計模式 模板方法模式

模板方法模式 類庫中大量使用,例如idbconnection介面 dbconnection抽象類 派生的sqlconnection和派生的oledbconnection就是使用了這種方法 1。介面,到能做的定義進來。一種規範 2.把共同的部分進去分離出來,放到乙個抽象的父類去實現.3.子類中實現 不...