欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

模板模式

程序员文章站 2022-07-10 17:45:27
摘录自headfirst 设计模式: 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤 实例说明: 做热咖啡或者热茶需要步骤:1.烧水,2.用沸水冲泡咖啡(或茶),3.倒进杯子里,4.加调料,其中步骤1和3 ......

摘录自headfirst 设计模式:

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

实例说明:

做热咖啡或者热茶需要步骤:1.烧水,2.用沸水冲泡咖啡(或茶),3.倒进杯子里,4.加调料,其中步骤1和3是做咖啡或茶共通的方法,步骤2和4的具体细节是不相同的,因此抽象出步骤类,将步骤2和4抽象成方法各子类均有不同实现

高层组件:CaffeineBeverageWithHook.java

/**
 * 高层组件
 *
 * @author :liuqi
 * @date :2018-06-11 16:00.
 */
public abstract class CaffeineBeverageWithHook {
    /**
     * 模板方法:抽出做茶和咖啡共通的方法
     */
    void prepareRecipe() {
        // 烧水
        boilWater();
        // 用沸水冲泡
        brew();
        // 倒进杯里
        pourIncup();
        // 如果顾客想要调料则添加调料
        if (customerWantsConfiments()) {
            // 添加调料
            addCondiments();
        }
    }

    /**
     * 用沸水冲泡(各子类实现不同)
     * <p>
     * 抽象方法
     */
    abstract void brew();

    /**
     * 加调料(各子类实现不同)
     * <p>
     * 抽象方法
     */
    abstract void addCondiments();

    /**
     * 烧水
     */
    void boilWater() {
        System.out.println("boiling water");
    }

    /**
     * 倒进杯里
     */
    void pourIncup() {
        System.out.println("Pouring into cup");
    }

    /**
     * 顾客是否想要调料
     * hook 钩子,子类可以覆盖
     *
     * @return
     */
    boolean customerWantsConfiments() {
        return true;
    }
}

 

低层组件:CoffeeWithHook.java  和  TeaWithHook.java

/**
 * 做咖啡的方法类
 *
 * @author :liuqi
 * @date :2018-06-11 16:00.
 */
public class CoffeeWithHook extends CaffeineBeverageWithHook {
    /**
     * 用沸水冲泡咖啡的方法
     */
    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }

    /**
     * 添加咖啡所需要的调料
     */
    @Override
    void addCondiments() {
        System.out.println("adding suger and milk");
    }

    /**
     * 覆盖了hook
     *
     * @return
     */
    @Override
    public boolean customerWantsConfiments() {
        // 顾客想要不加任何调料的咖啡(这里写死)
        return false;
    }
}

 

/**
 * 做茶的方法类
 *
 * @author :liuqi
 * @date :2018-06-11 16:09.
 */
public class TeaWithHook extends CaffeineBeverageWithHook {
    /**
     * 用沸水冲泡茶的方法
     */
    @Override
    void brew() {
        System.out.println("Steeping the tea");
    }

    /**
     * 添加茶所需要的调料
     */
    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }
}

 

测试类:BeverageTestDrive.java

 

/**
 * 测试类
 *
 * @author :liuqi
 * @date :2018-06-11 16:13.
 */
public class BeverageTestDrive {
    public static void main(String[] args) {
        TeaWithHook tea = new TeaWithHook();
        CoffeeWithHook coffee = new CoffeeWithHook();
        System.out.println("making tea~~~~~");
        tea.prepareRecipe();
        System.out.println("making coffee~~~~~");
        coffee.prepareRecipe();
    }
}

 

运行结果:

making tea~~~~~
boiling water
Steeping the tea
Pouring into cup
Adding lemon
making coffee~~~~~
boiling water
Dripping coffee through filter
Pouring into cup