码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——模板模式

时间:2015-08-26 00:18:23      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

模板模式:

准备一个抽象类,讲部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。


适用场景

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

2 重构时(把相同的代码抽取到分类)


优势:

1 封装性好

2 复用性好

3 疲敝细节

4 便于维护


缺点

1   继承


源码:


RefreshBeverage

package com.imooc.pattern.template;

/**
 * 抽象基类,为所有的子类提供一个算法框架
 */
public abstract  class RefreshBeverage {
    //制备饮料的模板方法,封装所有子类共同遵循的算法框架
    public final void prepareBeverageTemplate(){
        //1 将水煮沸
        boilWater();
        //2 炮制饮料
        brew();
        //3 将饮料倒入杯中
        pourInCup();
        if(isCustomerWantsCondiments()){
            //4 加入调味料
            addCondiments();
        }

    }

    /**
     * 基本方法
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }

    protected abstract void brew();

    /**
     * 基本方法
     */
    private void pourInCup() {
        System.out.println("将饮料倒入杯中");
    }

    protected abstract void addCondiments();
/**
 *     询问用户是否加入调料。HOOK,钩子函数,
 *     提供一个默认或为空的实现
 *     具体的子类可以自行决定是否挂钩以及如何挂钩
 *     询问用户是否加入饮料

 */
    protected boolean isCustomerWantsCondiments() {
        return true;
    }
}

Coffee

package com.imooc.pattern.template;

/**
 * 具体子类,提供了制备咖啡的具体实现
 */

public class Coffee extends RefreshBeverage {
    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("糖和牛奶");

    }
}

Tea

package com.imooc.pattern.template;

/**
 * 具体子类,提供茶的具体实现
 */
public class Tea extends RefreshBeverage {
    @Override
    protected void brew() {
        System.out.println("80度的热水浸泡茶叶5分钟");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入柠檬");
    }

    /**
     *
     * 子类通过覆盖的形式选择挂载钩子函数
     * @return
     */
    @Override
    protected boolean isCustomerWantsCondiments() {
        return false;
    }
}

RefreshBeverageTest

package com.imooc.pattern.template;

/**
 * 测试类
 */
public class RefreshBeverageTest {
    public static void main(String[] args) {
        System.out.println("制备咖啡。。。");
        RefreshBeverage b1 = new Coffee();
        b1.prepareBeverageTemplate();
        System.out.println("咖啡好了。。。");

        System.out.println("/n*****************");
        System.out.println("制备茶。。。");
        RefreshBeverage b2 = new Tea();
        b2.prepareBeverageTemplate();
        System.out.println("茶好了。。。");
    }
}

                                                                                                                 声明:慕课网学习笔记

设计模式——模板模式

标签:

原文地址:http://my.oschina.net/u/2361475/blog/497065

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!