Java設(shè)計模式之模板模式

模板模式

定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合于這種模式,如大話設(shè)計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景就適合于模板方法模式。我這次自己寫的是一個汽車啟動的過程,每一種汽車啟動的過程都基本是一樣的流程,無非是這一過程中存在一些細小差別。
總的來說,模板模式就是通過抽象類來定義一個邏輯模板,邏輯框架、邏輯原型,然后將無法決定的部分抽象成抽象類交由子類來實現(xiàn),一般這些抽象類的調(diào)用邏輯還是在抽象類中完成的。這么看來,模板就是定義一個框架,比如造車子,需要造車輪,車身,發(fā)動機,車燈等部分組成,不同的車的區(qū)別就在于這些部件的優(yōu)劣而已,但是總少不了這些東西。下面我就用一個例子來造一輛路虎越野車和一輛奧迪轎車。

模板模式實戰(zhàn)

首先需要創(chuàng)建一個模板抽象父類,將造車需要的模塊創(chuàng)建好。

public abstract class CarTemplate {
    protected String name;

    protected CarTemplate(String name){
        this.name = name;
    }

    protected abstract void buildWheel();

    protected abstract void buildEngine();

    protected abstract void buildCarbody();

    protected abstract void buildCarlight();

    public final void buildCar(){
        buildWheel();
        buildEngine();
        buildCarbody();
        buildCarlight();
    }
}

然后創(chuàng)建一個造路虎車的子類,用這個子類去繼承造車的公有模塊類CarTemplate。然后在方法中完善造路虎車特有的功能,代碼如下:

public class LandRover extends CarTemplate{

    public LandRover(String name) {
        super(name);
    }

    @Override
    protected void buildWheel() {
        System.out.println(name + "越野車輪");

    }

    @Override
    protected void buildEngine() {
        System.out.println(name + "柴油發(fā)動機");
    }

    @Override
    protected void buildCarbody() {
        System.out.println(name + "SUV越野車型");
    }

    @Override
    protected void buildCarlight() {
        System.out.println(name + "普通車燈");
    }
}

再創(chuàng)建一個造奧迪的子類,同樣用這個子類繼承模板類,并完善造奧迪的方法,代碼如下:

public class Audi extends CarTemplate {
    public Audi(String name) {
        super(name);
    }

    @Override
    protected void buildWheel() {
        System.out.println(name + "的普通轎車車輪");
    }

    @Override
    protected void buildEngine() {
        System.out.println(name + "的汽油發(fā)動機");
    }

    @Override
    protected void buildCarbody() {
        System.out.println(name + "的豪華舒適性車身");
    }

    @Override
    protected void buildCarlight() {
        System.out.println(name + "的獨特魔力車燈");
    }
}

測試

public class TemplateTest {
    public static void main(String[] args) {
        CarTemplate car1 = new LandRover("路虎");
        CarTemplate car2 = new Audi("奧迪");
        car1.buildCar();
        car2.buildCar();
    }
}

執(zhí)行結(jié)果

所有步驟都已完成,奧迪和路虎車運用統(tǒng)一模板,但是通過在子類中完善各自不同的方法而達到目的


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容