一、概述
类似于生活中很多事情都是有固定的流程和步骤,比如冲泡咖啡和泡茶它们都要经过如下步骤:
冲泡咖啡:
- 将水煮沸
- 用沸水冲泡咖啡
- 将饮料倒入杯中
- 添加糖和牛奶
泡茶
- 将水煮沸
- 用热水浸泡茶叶
- 将饮料倒入杯中
- 添加柠檬
于是我们可以将它们相同的步骤封装到父类中,而个性化的实现交给具体的子类来完成。
二、代码案例
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.测试结果
三、总结
模板方法模式优缺点:
优点:通用的模板方法在基类中实现,个性化的方法交由子类去实现
- 封装性好
- 复用性好
- 屏蔽细节
- 便于维护
缺点:因为一个类只能继承一个父类,对于已经一个已经继承过的类来说,不适宜使用该模式
- 继承