設計模式 | 模版方法設計模式介紹、模版方法使用案例

目錄

模版方法概念

模版方法使用案例


模版方法概念

定義:定義了一個算法骨架,並允許子類爲一個或多個步驟提供實現。模版方法使得子類在可以在不改變算法結構的情況下,重新定義算法的某些步驟

適用場景:一次性實現一個算法的不變部分,將可變部分留個子類實現;各子類中公共的行爲被提取出來並集中到一個公共父類中,從而避免代碼的重複編寫

優點:提高了複用性;提高了擴展性;符合開閉原則

缺點:類數量增多;增加了系統實現的複雜性;有繼承關係的自身缺點,如果父類增加了新的抽象方法,所有子類都要改一遍。

擴展:鉤子方法

模版方法使用案例

以講師製作視頻教程爲案例,製作過程中一般包含寫PPT、製作視頻、編寫手記等過程。寫PPT和製作視頻是所有課程必須的,但是寫手記是可選的。套用上面👆模版方法的定義,製作視頻教程的過程可以抽象爲由多個子步驟構成,且需要預留一個鉤子方法讓子類自己決定是不是需要寫手記。

新建抽象父類,父類包含所有步驟

public abstract class ACource {
    //製作課程
    protected final  void makeCource(){
        makePPT();
        makeVideo();
        if(needWriteArtical()){
            writeArtical();
        }
    }
    final  void makePPT(){
        System.out.println("製作PPT");
    }
    final void makeVideo(){
        System.out.println("製作視頻");
    }
    final void writeArtical(){
        System.out.println("編寫手記");
    }
    // 鉤子方法
    protected boolean needWriteArtical(){
        return false;
    }

     abstract void packageCourse();
}

新建設計模式課程類,繼承抽象父類。假設設計模式課程都是需要寫手記的,此處需要重寫父類的鉤子函數,返回true

public  class DesignPatternCource extends ACource{
    @Override
    void packageCourse(){
        System.out.println("提供課程java源代碼 ");
    }

    @Override
    protected boolean needWriteArtical(){
        return true;
    }
}

再新建前端課程類,相比於設計模式,前端課程需要提供圖片素材和前端代碼,而且前端課程又有很多細分的課程,例如vue、thymeleafd等,是否需要寫手記並不統一,所以需要將是否需要寫手記的權利開放給客戶端,具體的操作是重寫鉤子函數,並聲明變量控制鉤子函數的返回值

public  class FECource extends ACource{

    private boolean needWriteArticalFlag = false;
    @Override
    void packageCourse(){
        System.out.println("提供課程前端代碼 ");
        System.out.println("提供課程的圖片等素材 ");
    }

    public FECource(boolean needWriteArticalFlag) {
        this.needWriteArticalFlag = needWriteArticalFlag;
    }

    @Override
    protected boolean needWriteArtical(){
        return this.needWriteArticalFlag;
    }
}

測試如下

public class Test {
    public static void main(String[] args) {
        System.out.println("開始製作後端課程");
        ACource designPatternCource = new DesignPatternCource();
        designPatternCource.makeCource();
        System.out.println("後端課程結束");

        System.out.println();


        System.out.println("開始製作前端課程");
        ACource fECource = new FECource(true);
        fECource.makeCource();
        System.out.println("前端課程結束");
    }
}

打印輸出

模版方法設計模式適用的場景是工作中較常出現的,尤其是鉤子方法的合理適用可以規避權限風險,提升代碼的可閱讀性。

UML類圖如下:


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章