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");
            }
        });
    }
}


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