談談模板方法模式

2021-09-04 10:19:56 字數 1267 閱讀 9431

老規矩,看看百科上是怎麼描述模板方法模式的:模板方法模式定義了乙個演算法的步驟,並允許子類別為乙個或多個步驟提供其實踐方式。讓子類別在不改變演算法架構的情況下,重新定義演算法中的某些步驟。

回到實際開發中,**寫多了,可能就會碰到這麼樣的一種情況,我們有兩個演算法,兩個演算法在整體上來看上差不多的,但是細節上又有一點差異。

比如泡茶和泡咖啡。

從整體上來看,就是放入原料,然後衝入開水,最後再攪拌一下,最後喝下去。

但是細節上又有一點不同,比如第一步,泡茶放的是茶葉,而泡咖啡則是匯入咖啡粉。而且泡茶和泡咖啡所用的水可能也不一樣。

那麼,為了實現完美的**,或者要實現**復用,我們應該怎麼做?

這時候,模板方法模式就派上用場了,讓我們開始擼**吧。

定義乙個抽象類:該類有乙個brew方法,裡面分別進行加入原料,加入熱水,攪拌等操作,這些操作都是抽象的,也就是還沒有被實現,需要給子類去實現。

abstract class drink

abstract void putmaterial();

abstract void addboliedwater();

abstract void stir();

}

然後頂乙個泡茶子類,繼承飲料這個類,然後實現它的方法:

class tea extends drink

@override

void addboliedwater()

@override

void stir()

}

把關鍵步驟留給子類去實現,接下來執行一下brew這個方法

tea tea = new tea();

tea.brew();

執行結果:

放入茶葉

加入85度的開水

慢慢攪拌

那麼,我們也可以運用同樣的操作煮一杯咖啡:

class coffe extends drink

@override

void addboliedwater()

@override

void stir()

}

coffe coffe= new coffe();

coffe.brew();

執行結果:

加入咖啡粉

加入90度開水

快速攪拌

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...