设计模式——模版方法模式

来源:互联网 发布:陆丰龙山中学知乎 编辑:程序博客网 时间:2024/06/05 12:49

适用场景:

  1. 算法或操作遵循相似的逻辑

这里写图片描述

  1. 重构时(把相同的代码抽取到父类中)

  2. 重要、复杂的算法,核心算法设计为模版算法

优点:
1. 封装性好
2. 复用性好
3. 屏蔽细节
4. 便于维护
缺点:
继承(java语言是一个单继承的语言)

具体代码示例:

package com.imooc.pattern.template;/** * 模版方法模式 *  * 抽象基类,为所有子类提供一个算法框架 例子:提神饮料 *  * @author zhengzy *  */public abstract class RefleshBeverage {    /*     * 制备饮料的模版 方法 封装了所有子类共同遵循的算法框架     */    public final void prepareBeverageTemplate() {        // 步骤1 将水煮沸        boilWater();        // 步骤2 泡制饮料        brew();        // 步骤3 将饮料导入杯中        pourInCup();        if (isCustomerWantsCondiments()){            // 步骤4 加入调味料            addCondiments();        }    }    /*     * Hook,钩子函数,提供一个空的方法或者是默认实现     * 具体子类可以自行决定是否挂钩以及如何实现     * 询问用户是否加入调料     */    protected boolean isCustomerWantsCondiments() {        return true;    }    /*     *  步骤1 将水煮沸     */    private void boilWater() {        // TODO Auto-generated method stub        System.out.println("将水煮沸");    }    /*     * 抽象的基本方法     * 步骤2 泡制饮料     */    protected abstract void brew();    /*     * 步骤3 将饮料导入杯中     */    private void pourInCup() {        // TODO Auto-generated method stub        System.out.println("将饮料导入杯中");    }    /*     * 抽象的基本方法     * 步骤4 加入调味料     */    protected abstract void addCondiments();}
package com.imooc.pattern.template;/** * 具体子类,提供了咖啡制备的具体实现 * @author zhengzy * */public class Coffee extends RefleshBeverage {    @Override    protected void brew() {        System.out.println("用沸水冲泡咖啡");    }    @Override    protected void addCondiments() {        System.out.println("加入糖和牛奶");    }}
package com.imooc.pattern.template;/** * 具体子类,提供了茶制备的具体实现 *  * @author zhengzy *  */public class Tea extends RefleshBeverage {    @Override    protected void brew() {        System.out.println("用80°的热水浸泡茶叶5分钟");    }    @Override    protected void addCondiments() {        System.out.println("加入柠檬");    }    @Override    /*     * 子类通过覆盖的形式选择挂载函数     * @see com.imooc.pattern.template.RefleshBeverage#isCustomerWantsCondiments()     */    protected boolean isCustomerWantsCondiments() {        return false;    }}

测试:

package com.imooc.pattern.template;public class RefleshBeverageTest {    public static void main(String[] args) {        System.out.println("制备咖啡...");        RefleshBeverage r1 = new Coffee();        r1.prepareBeverageTemplate();        System.out.println("咖啡好了...");        System.out.println("\n************************************\n");        System.out.println("制备茶...");        RefleshBeverage r2 = new Tea();        r2.prepareBeverageTemplate();        System.out.println("茶好了...");    }}代码讲解:见注释。

结果:
这里写图片描述

demo下载

0 0