定義了一個算法的框架,將算法的具體步驟延遲到子類中實現(xiàn)。這樣可以在不改變算法結(jié)構(gòu)的情況下,允許子類重寫算法的特定步驟以滿足自己的需求
模版方法使用場景
- 算法框架固定,但具體步驟可以變化:當你有一個算法的整體結(jié)構(gòu)是固定的,但其中某些步驟的實現(xiàn)可能因情境不同而變化時,可以使用模板方法模式。這使得你可以在不改變整體結(jié)構(gòu)的情況下,通過子類來定制特定步驟的實現(xiàn)。
- 避免代碼重復(fù):當你有多個類中的方法具有相似的步驟,但實現(xiàn)細節(jié)有所不同時,可以將這些相似的步驟提取到一個抽象類的模板方法中,從而避免代碼重復(fù)。
- 框架或庫的設(shè)計:在框架或庫的設(shè)計中,通常會定義一些通用的算法框架,但具體實現(xiàn)需要留給使用者來完成。模板方法模式在這種情況下可以幫助定義框架的核心邏輯,同時留下擴展點供使用者進行自定義。
- 生命周期方法:當需要確保對象在特定的生命周期階段執(zhí)行特定步驟時,模板方法模式可以派上用場。比如在資源管理、初始化和銷毀等場景下。
- 代碼的擴展和維護:模板方法模式遵循開閉原則,當需要添加新的功能或修改算法的部分步驟時,只需要新增或修改子類,而不需要改動抽象類的代碼,從而提升了代碼的可擴展性和可維護性。
模版方法主要角色
- 抽象類(Abstract Class):定義了一個模板方法,它是一個包含算法框架的方法,其中的具體步驟可以是抽象方法或已實現(xiàn)的方法。抽象類還可以包含一些通用方法,這些方法在模板方法中被使用。
- 具體子類(Concrete Subclass):繼承抽象類并實現(xiàn)其中的抽象方法,從而完成算法的具體步驟。每個具體子類可以根據(jù)需要實現(xiàn)自己的邏輯。
模版方法java代碼實例
abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
}
class Coffee extends CaffeineBeverage {
void brew() {
System.out.println("Dripping coffee through filter");
}
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
class Tea extends CaffeineBeverage {
void brew() {
System.out.println("Steeping the tea");
}
void addCondiments() {
System.out.println("Adding lemon");
}
}
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
CaffeineBeverage coffee = new Coffee();
coffee.prepareRecipe();
CaffeineBeverage tea = new Tea();
tea.prepareRecipe();
}
}
在這個示例中,CaffeineBeverage 是抽象類,定義了制作咖啡因飲料的模板方法 prepareRecipe(),以及具體步驟中的通用方法。Coffee 和 Tea 是具體子類,分別實現(xiàn)了 brew() 和 addCondiments() 方法。在主程序中,我們創(chuàng)建了咖啡和茶的實例,并調(diào)用了它們的 prepareRecipe() 方法,實現(xiàn)了整個制作過程
模版方法優(yōu)缺點
優(yōu)點:文章來源:http://www.zghlxwxcb.cn/news/detail-671943.html
- 代碼復(fù)用性
模板方法模式鼓勵將相同的代碼邏輯放在抽象類中,從而避免在多個具體類中重復(fù)實現(xiàn)相同的代碼,提高了代碼的復(fù)用性。 - 高層邏輯抽象
模板方法將高層的算法邏輯抽象到抽象類中,使得具體子類只需要關(guān)注特定步驟的實現(xiàn),而無需考慮整體算法的結(jié)構(gòu)。 - 固定算法框架
模板方法定義了一個算法的框架,確保了整個算法的結(jié)構(gòu)一致性。這有助于遵循最佳實踐并減少錯誤。 - 易于維護
由于相同的代碼邏輯集中在抽象類中,修改算法邏輯或添加新特性只需要在一個地方進行修改,減少了維護的復(fù)雜性。 - 靈活性
具體子類可以通過重寫特定步驟來實現(xiàn)個性化需求,從而在保持整體框架不變的情況下增加靈活性。
缺點:文章來源地址http://www.zghlxwxcb.cn/news/detail-671943.html
- 限制子類的自由度
盡管模板方法模式提供一定程度的靈活性,但子類的擴展通常被限制在模板定義的框架內(nèi)。這可能導(dǎo)致某些情況下子類需要強行適應(yīng)框架,而不是完全自由地設(shè)計。 - 增加類的數(shù)量
使用模板方法模式通常會引入抽象類和具體子類,可能會增加類的數(shù)量,增加了代碼的復(fù)雜性。 - 不適合每個情況
并非所有算法都適合使用模板方法模式。如果算法的步驟變化較小或步驟變化較大,使用其他模式可能更合適。 - 復(fù)雜性增加
盡管模板方法模式可以幫助整理算法的結(jié)構(gòu),但在某些情況下可能會引入復(fù)雜性,尤其是當算法本身變得復(fù)雜時
到了這里,關(guān)于設(shè)計模式二十三:模板方法模式(Template Method Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!