【設計模式】模版模式

介紹

定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
這種類型的設計模式屬於結構性模式。算法

代碼實例

媒婆有兩個徒弟,work() 裏面的方法步驟是她給徒弟的平常工做安排
1:找客戶
2:根據客戶要求,介紹合適的人給客戶
3:撮合男女雙方見面
……
具體的細節,讓徒弟本身擴展設計模式

public abstract class MeiPo {
    abstract void searchforRequest();
    abstract void doing();
    abstract void meetManAndMomen();

    //模板方法核心,抽取出子類的共性
    public final void work(){

        //尋找有需求的顧客
        searchforRequest();

        //根據顧客需求,物色合適對象
        doing();

        //撮合男女雙方
        meetManAndMomen();


    }
}

媒婆1號徒弟的工做安排app

/**
 * 媒婆1號徒弟,只給女顧客介紹對象
 */
public class MeiPoTudi1 extends  MeiPo {
    @Override
    void searchforRequest() {
        System.out.println("尋找想找對象的女客戶");
    }

    @Override
    void doing() {
        System.out.println("給女客戶物色合適的男生");
    }

    @Override
    void meetManAndMomen() {
        System.out.println("撮合男女雙方見面,看女方反饋");
    }
}

媒婆2號徒弟的工做安排ide

/**
 * 媒婆2號徒弟,只給男顧客介紹對象
 */
public class MeiPoTudi2 extends  MeiPo {
    @Override
    void searchforRequest() {
        System.out.println("尋找想找對象的男客戶");
    }

    @Override
    void doing() {
        System.out.println("給男客戶物色合適的女生");
    }

    @Override
    void meetManAndMomen() {
        System.out.println("撮合男女雙方見面,看男方反饋");
    }
}

客戶端測試測試

public class TemplatePatternTest {
    public static void main(String[] args) {

        MeiPo meiPo1 = new MeiPoTudi1();
        meiPo1.work();
        System.out.println();
       MeiPo meiPo2 = new MeiPoTudi2();
        meiPo2.work();
    }
}
模版方法類圖

在這裏插入圖片描述

這個就是模版方法,將通用的邏輯在抽象類(MeiPo)中抽象出來,具體的步驟在子類中實現spa

應用實例

Spring源碼裏面 DispatcherServlet#initStrategies()初始化策略方法設計

protected void initStrategies(ApplicationContext context) {
        //多文件上傳的組件
        initMultipartResolver(context);
        //初始化本地語言環境
        initLocaleResolver(context);
        //初始化模板處理器
        initThemeResolver(context);
        //handlerMapping
        initHandlerMappings(context);
        //初始化參數適配器
        initHandlerAdapters(context);
        //初始化異常攔截器
        initHandlerExceptionResolvers(context);
        //初始化視圖預處理器
        initRequestToViewNameTranslator(context);
        //初始化視圖轉換器
        initViewResolvers(context);
        //
        initFlashMapManager(context);
    }

使用場景

一、有多個子類共有的方法,且邏輯相同。 二、重要的、複雜的方法,能夠考慮做爲模板方法。code

優缺點
優勢: 一、封裝不變部分,擴展可變部分。 二、提取公共代碼,便於維護。 三、行爲由父類控制,子類實現。對象

缺點:每個不一樣的實現都須要一個子類來實現,致使類的個數增長,使得系統更加龐大。blog

相關文章
相關標籤/搜索