java設計模式學習筆記12-模板方法模式

模板方法模式,是類的行爲模式,準備一個抽象類,將部分邏輯已具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯;不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現,頂級邏輯的模板方法不可改;

1. 抽象模板角色

/**
 * 模板方法模式-抽象模板角色-含有基本方法:抽象方法(必須實現),鉤子方法(可選擇重寫),具體方法(以實現不可改) 
 */
@Slf4j
public abstract class AbstractTemplate {

    /**
     * 頂級邏輯-模板方法
     */
    public void installDesk() {
        createDeskLeg();
        createDeskTop();
        doInstallDeskLegAndTop();
        checkDesk();
    }

    /**
     * 抽象方法(由子類實現)
     */
    protected abstract void createDeskLeg();

    /**
     * 抽象方法(由子類實現)
     */
    protected abstract void createDeskTop();

    /**
     * 基本方法(鉤子方法-具體模板角色可以重寫)
     */
    protected void doInstallDeskLegAndTop() {
        log.info("模板方法模式-抽象模板角色-組裝桌腿和桌面");
    }

    /**
     * 具體方法(已經實現)
     */
    private void checkDesk() {
        log.info("模板方法模式-抽象模板角色-檢查桌子");
    }
}

2. 具體模板方法

/**
 * 模板方法模式-具體模板角色 
 */
@Slf4j
public class ConcreteTemplate extends AbstractTemplate {
    /**
     * 實現抽象模板角色的抽象方法
     */
    @Override
    protected void createDeskLeg() {
        log.info("模板方法模式-具體模板角色-製造桌腿");
    }

    /**
     * 實現抽象模板角色的抽象方法
     */
    @Override
    protected void createDeskTop() {
        log.info("模板方法模式-具體模板角色-製造桌面");
    }

    /**
     * 重寫抽象模板角色的鉤子方法
     */
    @Override
    protected void doInstallDeskLegAndTop() {
        log.info("模板方法模式-具體模板角色-組裝桌腿和桌面");
    }
}
/**
 * 模板方法模式-具體模板角色2 
 */
@Slf4j
public class ConcreteTemplate2 extends AbstractTemplate {
    /**
     * 實現抽象模板角色的抽象方法
     */
    @Override
    protected void createDeskLeg() {
        log.info("模板方法模式-具體模板角色2-製造桌腿");
    }

    /**
     * 實現抽象模板角色的抽象方法
     */
    @Override
    protected void createDeskTop() {
        log.info("模板方法模式-具體模板角色2-製造桌面");
    }

    // 具體模板角色2---不重寫抽象模板角色的鉤子方法
}

3. 測試:

/**
 * 模板方法模式-測試 
 */
@Slf4j
public class TemplateMethodTest {

    @Test
    public void test() {
        AbstractTemplate template = new ConcreteTemplate();
        template.installDesk();

        log.info("----------------------------------------------");

        template = new ConcreteTemplate2();
        template.installDesk();
    }
}

4. 測試結果

5. HttpServlet就是經典的模板方法模式,HttpService類提供了service方法作爲頂級邏輯,其內部的七個do方法就是抽象方法交由其子類實現.

 

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