學習模板方法模式,讓我想到了貝爺吃蟲子

2021-10-06 20:22:39 字數 3539 閱讀 8017

改善版:

優點:缺點:

定義乙個方法,這個方法不能被子類複寫但是可以被子類呼叫。在這個方法裡規定了演算法流程或者方法呼叫順序。按照這種想法實現的就叫模板方法模式。

說總是模糊,給你看更清晰!

假設咱們來總結一下貝爺吃昆蟲的節目,然後用模板方法模式做個小案例。

我們來分析一下貝爺,吃昆蟲的流程:

抓蟲子去頭

去內臟一口吞

點評一波

下邊在咱們就按照這個模板來做個模板方法小案例

昆蟲——父類、模板方法所在類

package 模板方法模式;

public

abstract

class 昆蟲

/** * 抓蟲子

* 抽象方法,具體由子類實現(抓什麼蟲子)

*/abstract

void

grab()

;/**

* 去頭

*/void

decapitation()

/** * 去除內臟

*/void

gutted()

void

eat(

)/**

* 吃完蟲子後的評價——抽象方法

*/abstract

void

evaluation()

;}

然後寫具體的子類

螞蚱

package 模板方法模式;

public

class 螞蚱 extends 昆蟲

@override

void

evaluation()

}

天花幼蟲

package 模板方法模式;

public

class 天牛幼蟲 extends 昆蟲

@override

void

evaluation()

}

接下來開始重點戲:貝爺開始吃蟲貝爺

package 模板方法模式;

public

class 貝爺

}

執行結果:

荒野求生節目,現在開始!

----

----

--貝爺,抓住了乙個螞蚱!

去頭擠出內臟

一口吞下

味道像雞肉,還不錯!

----

----

--貝爺,捉到乙隻天牛幼蟲!

去頭擠出內臟

一口吞下

這條蟲,是我吃過最難吃的東西之一

我們可以看到上邊定義了吃蟲子方法的模板後,具體到某個蟲子,只需要再寫一點點**,然後呼叫模板方法就可以了。

他的優勢也是他的弱勢,當子類具體方法各不相同時,寫這個模板不僅沒用還麻煩。

經常看荒野求生的人應該知道,貝爺吃過的蟲子還有蚯蚓!!沒有去頭!沒有擠出內臟,那怎麼辦呢?

使用鉤子函式,其實就是呼叫方法時加乙個** if **的事,true就條用,false就不呼叫。

下面咱們改善一下**。

昆蟲:

package 模板方法模式.improve;

public

abstract

class 昆蟲 if(

needgutted()

)eat()

;evaluation()

;}/** * 鉤子函式,確定是否需要去頭

* @return

*/public

boolean

needdecapitation()

/** * 鉤子函式,決定是否需要去內臟

* @return

*/public

boolean

needgutted()

/** * 抓蟲子

* 抽象方法,具體由子類實現(抓什麼蟲子)

*/abstract

void

grab()

;/**

* 去頭

*/void

decapitation()

/** * 去除內臟

*/void

gutted()

void

eat(

)/**

* 吃完蟲子後的評價——抽象方法

*/abstract

void

evaluation()

;}

因為鉤子函式預設返回的是true,所以在螞蚱、天牛幼蟲實現時,不用做任何改變。而蚯蚓就需要複寫一下鉤子函式的**了。

蚯蚓

package 模板方法模式.improve;

public

abstract

class 昆蟲 if(

needgutted()

)eat()

;evaluation()

;}/** * 鉤子函式,確定是否需要去頭

* @return

*/public

boolean

needdecapitation()

/** * 鉤子函式,決定是否需要去內臟

* @return

*/public

boolean

needgutted()

/** * 抓蟲子

* 抽象方法,具體由子類實現(抓什麼蟲子)

*/abstract

void

grab()

;/**

* 去頭

*/void

decapitation()

/** * 去除內臟

*/void

gutted()

void

eat(

)/**

* 吃完蟲子後的評價——抽象方法

*/abstract

void

evaluation()

;}

再讓貝爺吃一波看看

貝爺

package 模板方法模式.improve;

public

class 貝爺

}

荒野求生節目,現在開始!

----

----

--貝爺,抓住了乙個螞蚱!

去頭擠出內臟

一口吞下

味道像雞肉,還不錯!

----

----

--貝爺,捉到乙隻天牛幼蟲!

去頭擠出內臟

一口吞下

這條蟲,是我吃過最難吃的東西之一

----

----

--貝爺,抓住了一條蚯蚓!

一口吞下

這玩意,味道出乎意料,有點像義大利面

通過鉤子函式我們可以控制一些方法是否呼叫。增加了可用性。

當需要變化的太多時,如果每個都需要加鉤子函式,那就是去了模板的意義。

設計模式學習 模板方法模式

型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...

設計模式學習 模板方法模式

1.雜言 設計模式,現在覺得每種模式像工業行業的一些典型零件。這些零件也可以變種出很多類似零件。吧這些零件組合起來,就成了一台機器。好吧,我現在是這麼理解的。一般 結構都是,一層呼叫一層,就是一般都是頂層的呼叫底層的。但模板方法確實反過來的,有父類呼叫子類的方法。這個聽說又牽扯到啥好萊塢原則。對於這...

設計模式學習 模板方法模式

模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟.父類就應該要成為子類的模板,所有重複的 都應該要上公升到父類中,而不是讓每個子類都取重複,重要,複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細...