当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 模板模式

模板模式

2018年06月11日  | 移动技术网IT编程  | 我要评论

摘录自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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网