java設計模式(行爲型)之模板方法模式

第0章:簡介

模板方法模式定義:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟

模板方法模式本質:固定算法骨架

參考:研磨設計模式(書籍),大話設計模式(書籍)

模式圖:

待補充


第1章:實踐

第0節:模板方法模式(原語、鉤子操作實現)

(1)模板(Template.java)

package com.mcc.core.designPattern.behavior.templateMethod.simpleTemplateMethod;

/**
 * 模板
 *
 * 模板方法模式的定義:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。
 * 模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
 *
 * 模板方法模式的本質:固定算法骨架
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午4:33
 */
public abstract class Template {

    /**
     * 原語操作
     * 原語操作即是抽象的操作,必須由子類提供實現
     */
    public abstract void methodStep1();

    /**
     * 鉤子操作
     * 鉤子操作即是在模板中定義,並提供默認實現的操作
     */
    protected void methodStep2(){
        System.out.println("步驟2默認操作,子類可以選擇並具體實現");
    }


    /**
     * 具體操作,固定實現,不需要子類直接訪問
     */
    private void methodStep3(){
        System.out.println("步驟3操作,模板固定實現");
    }


    /**
     * 模板方法,定義算法骨架
     * final關鍵字修飾表示子類不能繼承修改此方法
     */
    public final void templateMethod(){

        //骨架,可加入其它邏輯
        //步驟1
        this.methodStep1();
        //步驟2
        this.methodStep2();
        //步驟3
        this.methodStep3();

    }
}

(2)模板實現類A(TemplateExtendsA.java)

package com.mcc.core.designPattern.behavior.templateMethod.simpleTemplateMethod;

/**
 * 模板實現類A
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午5:16
 */
public class TemplateExtendsA extends Template {
    /**
     * 實現模板接口的原語操作
     */
    @Override
    public void methodStep1() {
        System.out.println("模板實現類A的步驟1實現操作");
    }
}

(3)模板實現類B(TemplateExtendsB.java)

package com.mcc.core.designPattern.behavior.templateMethod.simpleTemplateMethod;

/**
 * 模板實現類B
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午5:19
 */
public class TemplateExtendsB extends Template {
    /**
     * 實現模板接口的原語操作
     */
    @Override
    public void methodStep1() {
        System.out.println("模板實現類B的步驟1實現操作");
    }

    /**
     * 複寫模板接口的鉤子操作,覆蓋默認的方法實現
     */
    @Override
    protected void methodStep2() {
        System.out.println("模板實現類B的步驟1實現操作,覆蓋了父類該方法的默認操作");
    }
}

(4)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.templateMethod.simpleTemplateMethod;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午5:24
 */
public class Client {

    public static void main(String args[]){

        System.out.println("\n實現類A的算法邏輯:\n");
        //調用模板實現類A的算法邏輯
        Template templateA = new TemplateExtendsA();
        templateA.templateMethod();

        System.out.println("\n實現類B的算法邏輯:\n");
        //調用模板實現類B的算法邏輯
        Template templateB = new TemplateExtendsB();
        templateB.templateMethod();
    }
}


第1節:模板方法模式(回調方法實現)

(1)回調接口(Callback.java)

package com.mcc.core.designPattern.behavior.templateMethod.callbackTemplateMethod;

/**
 * 回調接口,定義所有需要被擴展的方法
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午6:50
 */
public interface Callback {

    /**
     * 回調方法,步驟1
     */
    public void methodStep1();

    /**
     * 回調方法,步驟2
     */
    public void methodStep2();
}

(2)模板方法(Template.java)

package com.mcc.core.designPattern.behavior.templateMethod.callbackTemplateMethod;

/**
 * 模板方法
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午5:33
 */
public class Template {

    /**
     * 具體操作,固定實現,不需要子類直接訪問
     */
    private void methodStep3(){
        System.out.println("步驟3操作,模板固定實現");
    }

    /**
     * 模板方法,定義算法骨架
     * final關鍵字修飾表示子類不能繼承修改此方法
     * @param callback 回調接口
     */
    public final void templateMethod(Callback callback){

        //骨架,可加入其它邏輯
        //步驟1,採用回調方式,調用模板方法的時候再實現具體邏輯
        callback.methodStep1();
        //步驟2,採用回調方式,調用模板方法的時候再實現具體邏輯
        callback.methodStep2();
        //步驟3,模板固定實現
        this.methodStep3();

    }
}

(3)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.templateMethod.callbackTemplateMethod;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午6:55
 */
public class Client {

    public static void main(String args[]){

        Template template = new Template();
        template.templateMethod(new Callback() {
            @Override
            public void methodStep1() {
                System.out.println("回調方式實現了步驟1");
            }

            @Override
            public void methodStep2() {
                System.out.println("回調方式實現了步驟2");
            }
        });
    }
}


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