更新時(shí)間:2023-09-14 來(lái)源:黑馬程序員 瀏覽量:
模板方法模式(Template Method Pattern)是一種行為設(shè)計(jì)模式,它屬于Gang of Four(GoF)設(shè)計(jì)模式之一。這個(gè)模式的核心思想是定義一個(gè)算法的骨架,將算法的具體步驟延遲到子類(lèi)中實(shí)現(xiàn),以允許子類(lèi)在不改變算法結(jié)構(gòu)的情況下重定義算法的某些步驟。模板方法模式通過(guò)提供一個(gè)模板(或者說(shuō)是抽象基類(lèi))來(lái)封裝算法,以確保算法的結(jié)構(gòu)一致性,同時(shí)允許不同的子類(lèi)提供不同的實(shí)現(xiàn)。
以下是模板方法模式的關(guān)鍵要素和示例說(shuō)明:
抽象類(lèi)定義了算法的骨架,它包含一個(gè)或多個(gè)抽象方法,這些方法代表算法中的步驟,但不提供具體的實(shí)現(xiàn)。
public abstract class AbstractClass { public void templateMethod() { step1(); step2(); step3(); } protected abstract void step1(); protected abstract void step2(); protected abstract void step3(); }
具體子類(lèi)繼承抽象類(lèi)并實(shí)現(xiàn)抽象方法,從而提供算法步驟的具體實(shí)現(xiàn)。
public class ConcreteClassA extends AbstractClass { @Override protected void step1() { // 具體實(shí)現(xiàn)步驟1的邏輯 } @Override protected void step2() { // 具體實(shí)現(xiàn)步驟2的邏輯 } @Override protected void step3() { // 具體實(shí)現(xiàn)步驟3的邏輯 } } public class ConcreteClassB extends AbstractClass { @Override protected void step1() { // 不同的實(shí)現(xiàn)方式 } @Override protected void step2() { // 不同的實(shí)現(xiàn)方式 } @Override protected void step3() { // 不同的實(shí)現(xiàn)方式 } }
模板方法是抽象類(lèi)中定義的方法,它按照特定的順序調(diào)用算法步驟,這個(gè)順序是固定的,但具體步驟的實(shí)現(xiàn)可以在子類(lèi)中變化。
在抽象類(lèi)中,可以包含一些可選的鉤子方法,這些方法在模板方法中可以有默認(rèn)實(shí)現(xiàn),但子類(lèi)可以選擇性地覆蓋它們以改變算法的行為。
public abstract class AbstractClass { // 模板方法 public void templateMethod() { step1(); step2(); if (hook()) { // 鉤子方法 step3(); } } protected abstract void step1(); protected abstract void step2(); protected abstract void step3(); // 鉤子方法,默認(rèn)實(shí)現(xiàn)返回true protected boolean hook() { return true; } }
使用模板方法模式的好處包括:
·代碼重用:模板方法將共同的行為放在抽象類(lèi)中,可以在多個(gè)子類(lèi)中共享。
·算法結(jié)構(gòu)固定性:確保算法的基本結(jié)構(gòu)不會(huì)改變,只是具體步驟的實(shí)現(xiàn)會(huì)變化。
·擴(kuò)展性:子類(lèi)可以輕松地?cái)U(kuò)展或修改算法的特定步驟,而無(wú)需改變整體算法結(jié)構(gòu)。
模板方法模式在Java中廣泛用于創(chuàng)建具有相似結(jié)構(gòu)但不同行為的類(lèi),例如,各種排序算法可以使用模板方法模式來(lái)實(shí)現(xiàn),其中排序的比較和交換步驟在不同的子類(lèi)中實(shí)現(xiàn)。這提供了一種靈活的方式來(lái)處理算法的變化和擴(kuò)展。