首頁(yè)常見(jiàn)問(wèn)題正文

什么是模板方法模式?_java設(shè)計(jì)模式基礎(chǔ)

更新時(shí)間:2023-09-14 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  模板方法模式(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ō)明:

  1.抽象類(lèi)(Abstract Class):

  抽象類(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();
}

  2.具體子類(lèi)(Concrete Subclasses):

  具體子類(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)方式
    }
}

  3.模板方法(Template Method):

  模板方法是抽象類(lèi)中定義的方法,它按照特定的順序調(diào)用算法步驟,這個(gè)順序是固定的,但具體步驟的實(shí)現(xiàn)可以在子類(lèi)中變化。

1694654537543_模板方法模式.jpg

  4.鉤子方法(Hook Methods):

  在抽象類(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ò)展。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!