您的位置:首页 > 编程语言 > Java开发

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

2017-01-12 17:41 561 查看
一、概述

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

冲泡咖啡:

将水煮沸

用沸水冲泡咖啡

将饮料倒入杯中

添加糖和牛奶

泡茶

将水煮沸

用热水浸泡茶叶

将饮料倒入杯中

添加柠檬

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

二、代码案例

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.测试结果



三、总结

模板方法模式优缺点:

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

封装性好

复用性好

屏蔽细节

便于维护

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

继承
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: