模板方法模式 我們一起下餃子

2021-10-06 21:16:50 字數 3892 閱讀 3235

小帥在外奔波多年,厭倦了程式設計師的生活,終於決定回老家安定下來,開了個餃子館,天天下餃子。

小帥跟乙個大廚苦練餃子製作,自己總結了一下餃子製作的過程:

擀麵皮

包餡水煮

出鍋加基本調料

加其他調料(顧客自行新增)

小帥就以這個流程為模板,在店裡做各種各樣的餃子,恩,生意還挺好的。

小帥發揮程式設計師的特長,把做餃子的經過用**寫了下來,其實很簡單:

製作韭菜餡餃子

/**

* 韭菜餡餃子

*/public

class

leekdumpling

// 擀麵皮

public

void

ganmianpi()

// 包餡

public

void

baoxian()

// 水煮

public

void

shuizhu()

// 出鍋

public

void

chuguo()

// 加基本調料

public

void

jiajibentiaoliao()

// 加其他調料

public

void

jiaqitatiaoliao()

}

製作豬肉餡餃子

/**

* 豬肉餡餃子

*/public

class

porkdumpling

// 擀麵皮

public

void

ganmianpi()

// 包餡

public

void

baoxian()

// 水煮

public

void

shuizhu()

// 出鍋

public

void

chuguo()

// 加基本調料

public

void

jiajibentiaoliao()

// 加其他調料

小帥的店裡不僅有韭菜餡餃子,豬肉餡餃子還有牛肉餡,蘑菇餡,海鮮餡餃子等等十幾種呢,各種餃子的製作過程其實都是大同小異,主要是包的餡不一樣,然後就水煮的時間不一樣。

如果每種餃子都各自實現一次所有的**,會出現大量的重複**,該怎麼改進呢?

其實每種餃子的製作都是按固定的流程製作的,這種情況就非常適合使用模板方法模式。

模板方法模式定義如下:模板方法模式在乙個方法中定義乙個演算法骨架,並將某些步驟推遲到子類中實現。模板方法模式可以讓子類在不改變演算法整體結構的情況下,重新定義演算法中的某些步驟。

類圖如下:

按照模板方法模式改造一下:

餃子抽象類

public

abstract

class

dumpling

/** * 擀麵皮

*/public

void

ganmianpi()

/** * 包餡(抽象方法需要在子類中實現)

*/public

abstract

void

baoxian()

;/**

* 水煮(抽象方法需要在子類中實現)

*/public

abstract

void

shuizhu()

;/**

* 出鍋

*/public

void

chuguo()

/** * 加基本調料

*/public

void

jiajibentiaoliao()

/** * 鉤子(自定義擴充套件方法,預設實現為空)

*/public

void

hook()

}

韭菜餡餃子

/**

* 韭菜餡餃子

*/public

class

leekdumpling

extends

dumpling

/** * 水煮

*/@override

public

void

shuizhu()

}

豬肉餡餃子

/**

* 豬肉餡餃子

*/public

class

porkdumpling

extends

dumpling

/** * 水煮

*/@override

public

void

shuizhu()

/** * 覆蓋hook()方法,加其他調料

*/@override

public

void

hook()

}

製作餃子

public

class

makedumpling

}

輸出結果

製作韭菜餡餃子

擀麵皮包韭菜餡

水煮8分鐘

出鍋加醋

製作豬肉餡餃子

擀麵皮包豬肉餡

水煮10分鐘

出鍋加醋

加重辣

餃子的固定製作過程,擀麵皮【ganmianpi()】,出鍋【chuguo()】, 加基本調料【jiajibentiaoliao()】每種餃子都是一樣的,所以直接在父類中實現,實現了**的復用。

包餡【baoxian()】,水煮【shuizhu()】每種餃子都不一樣,定義為抽象方法,具體的操作推遲到子類中實現。

鉤子【hook()】方法比較有意思,在父類中預設實現為空,如果子類有什麼特殊的操作,父類中沒有定義的,那麼子類就可以覆蓋hook(),實現自己擴充套件的業務邏輯。

比如加辣椒,不是每個客人都喜歡吃辣的,那麼需要加辣椒的顧客自己覆蓋hook()方法,加上辣椒就行了,不需要加辣椒的顧客就不用重寫hook()方法了。

在模板模式經典的實現中,模板方法定義為 final,可以避免被子類重寫。

需要子類重寫的方法定義為 abstract,可以強迫子類去實現。

如果子類需要擴充套件,可以預留乙個hook()的空實現方法,讓需要的子類去重寫。

該模式應用了好萊塢原則:別呼叫(打**給)我們,我們會呼叫(打**給)你

換句話說就是:子類你別呼叫我們(父類),我們(父類)會呼叫你。

模板模式有兩大作用:復用和擴充套件

復用指的是,所有的子類可以復用父類中提供的模板方法的**。

擴充套件指的是,框架通過模板模式提供功能擴充套件點,也就是鉤子hook(),讓框架使用者可以在不修改框架原始碼的情況下,基於擴充套件點定製化框架的功能。

**鏈結

我們一起學python

直接上乾貨,這裡主要介紹一下python與c語言在基本語法上的不同 1 字串既可以被 包圍還可以被 包圍,效果一樣。2 有兩種除法 和 前者的用法和c一樣,整數相除為整數 後一種結果可能為小數。3 python中語句結束沒有分號,douhao。4 冒號後表示縮排的是 塊,並且縮排只能是4個空格 我也...

我們沒有在一起

你一直說的那個公園已經拆了 還記得蕩著鞦韆日子就飛起來 漫漫的下午陽光都在臉上撒野 你那傻氣 我真是想念 那時候小小的你還沒學會嘆氣 誰又會想到他們現在喊我女王 你哈哈笑的樣子倒是一點沒變 時間走了 誰還在等呢 這杯咖啡忘了加糖 真不是我那麼傷感 世界太複雜 你說單純很難 我當然都明白 可是呀只有你...

跟我一起透徹理解template模板模式

include using namespace std template模式。class base protected virtual void printf1 0 virtual void printf2 0 讓子類實現演算法的具體實現。class son1 public base void pr...