java设计模式学习之模板方法模式

一、概述

类似于生活中很多事情都是有固定的流程和步骤,比如冲泡咖啡和泡茶它们都要经过如下步骤:
冲泡咖啡:

  1. 将水煮沸
  2. 用沸水冲泡咖啡
  3. 将饮料倒入杯中
  4. 添加糖和牛奶

泡茶

  1. 将水煮沸
  2. 用热水浸泡茶叶
  3. 将饮料倒入杯中
  4. 添加柠檬

于是我们可以将它们相同的步骤封装到父类中,而个性化的实现交给具体的子类来完成。

二、代码案例

1.定义抽象基类RefreshBeverage.java

package com.czhappy.designpattern.template;

/**
 * 
 * @ClassName: RefreshBeverage  
 * @Description: 抽象基类
 * @author chenzheng
 * @date 2017-1-12 下午04:36:41
 */
public abstract class RefreshBeverage { 

    //此处要声明为final,不能让子类覆盖该方法
    public final void prepareBeverageTemplate(){
        //将水煮沸
        boilWater();
        //浸泡
        brew();
        //将饮料倒入杯中
        pourInCup();
        //特殊的需求特殊处理
        if(isCustomerWantsCondiments()){
            //添加调味料
            addCondiments();
        }
    }

    protected boolean isCustomerWantsCondiments() {
        // TODO Auto-generated method stub
        return true;
    }

    protected abstract void addCondiments();

    private void pourInCup() {
        System.out.println("将饮料倒入杯中");

    }

    protected abstract void brew();

    private void boilWater() {
        System.out.println("将水煮沸");
    }
}

2.咖啡类Coffee.java

package com.czhappy.designpattern.template;

public class Coffee extends RefreshBeverage{

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

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

3.茶类Tea.java

package com.czhappy.designpattern.template;

public class Tea extends RefreshBeverage{

    @Override
    protected void brew() {
        System.out.println("用热水浸泡茶叶");
    }

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

    @Override
    protected boolean isCustomerWantsCondiments() {
        // TODO Auto-generated method stub
        return true;
    }
}

4.测试类RefreshBeverageTest.java

package com.czhappy.designpattern.template;

public class RefreshBeverageTest {

    public static void main(String[] args) {
        System.out.println("置备咖啡...");
        RefreshBeverage rb1 = new Coffee();
        rb1.prepareBeverageTemplate();
        System.out.println("咖啡好了");
        System.out.println("\n***************");
        System.out.println("置备茶...");
        RefreshBeverage rb2 = new Tea();
        rb2.prepareBeverageTemplate();
        System.out.println("茶好了");
    }

}

5.测试结果
这里写图片描述

三、总结

模板方法模式优缺点:
优点:通用的模板方法在基类中实现,个性化的方法交由子类去实现

  • 封装性好
  • 复用性好
  • 屏蔽细节
  • 便于维护

缺点:因为一个类只能继承一个父类,对于已经一个已经继承过的类来说,不适宜使用该模式

  • 继承
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值