23种java设计模式之模板模式

说实话,我们学的框架其实就是模板,是不是这样引出话题就能很快理解模板模式呢,好了,下面我们用一个经典的泡咖啡,泡茶案例来说明模板模式。

泡咖啡步骤:水烧开--->冲泡咖啡粉--->把咖啡倒入杯子--->加糖和牛奶

泡茶步骤:水烧开--->冲泡茶叶--->把茶水导入杯子--->加柠檬

对于传统方法来思考,给一个HotDrinkHook超类,然后给出每个步骤的抽象类,让子类Coffee和Tea去完成,但是,有没有考虑到这泡咖啡和泡茶两者是否有共同点呢?比如第一个步骤和第三个步骤,完全一样嘛,所以,我们可以用模板模式来解决这个问题。

我们先给出分析类图:


给出超类HotDrinkHook:

public abstract class HotDrinkHook {
public final void Prepare(){
//烧水
BoilWater();

//泡(茶、咖啡)
Brew();

//倒进杯子
PutInCup();

//加配料
if(wantAddCondiments()){
AddCondiments();
}else{
System.out.println("不用了,谢谢!!!");
}

}

public boolean wantAddCondiments() {
//默认为需要添加
return true;
}

public abstract void AddCondiments();

private void PutInCup() {
System.out.println("把做好的倒入杯子!!!");
}

public abstract void Brew();

private final void BoilWater() {
System.out.println("把水烧开!!!");
}
}

对于那两个相同的方法我们用final来修饰,保证后面的子类也是按照这个方法,然后对于不同的方法我们用抽象方法写出,让子类自己去实现,这里我们还给出了第四步,让顾客自己选择是否加配料

CoffeeHook 子类:

public class CoffeeHook extends HotDrinkHook {
public void AddCondiments() {
System.out.println("加入咖啡!!!");
}

public void Brew() {
System.out.println("泡咖啡!!!");
}
public boolean wantAddCondiments() {
System.out.println("您是否要添加调味品(y/n):");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String str="";
try {
str=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(str.equals("n")){
return false;
}
return true;
}
}

对于TeaHook就是两个方法不同,别的和CoffeeHook一样:

public void AddCondiments() {
System.out.println("加入柠檬!!!");
}

public void Brew() {
System.out.println("泡茶!!!");
}


最后测试Test:

public class Test {
public static void main(String[] args){
TeaHook teaHook=new TeaHook();
CoffeeHook coffeeHook=new CoffeeHook();

teaHook.Prepare();

coffeeHook.Prepare();

}
}

这样就可以满足条件了。

总结:

模板模式:模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现

通俗讲模板模式是这个算法或者说这个步骤是final的,不变的,保证了后面的子类也是按照这个算法做的,然后子类里面只要关系抽象函数的实现,不用关系步骤什么的,所以子类里面关心的东西就少多了,同时它把东西放在超类后,整个体系要改的话,只要在超类里改就行了,所以一定程度上对于维护,拓展,集中管理,更好维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值