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

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

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

对于传统方法来思考,给一个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的,不变的,保证了后面的子类也是按照这个算法做的,然后子类里面只要关系抽象函数的实现,不用关系步骤什么的,所以子类里面关心的东西就少多了,同时它把东西放在超类后,整个体系要改的话,只要在超类里改就行了,所以一定程度上对于维护,拓展,集中管理,更好维护。

23种java设计模式之模板模式相关推荐

  1. 研磨23种大话设计模式------简单工厂模式 + 工厂方法模式 + 抽象工厂模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 简 ...

  2. Java设计模式之模板模式【通过LOL选英雄案例】

    初衷 设计模式(Design Pattern)引用百度百科中的一句话,就是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.实际上在我们的实际编码中到处都有设计模式的影子,比如最常用的单例 ...

  3. java设计模式之模板模式

    模板模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同 ...

  4. 二、java设计模式之模板模式深进浅出

    一.背景 模板模式具体怎么使用,下面我会详细讲,如果有那个地方讲的不到位了,请大家多多指教,共同学习,我尽量以白话的形式进行展示,废话不多说了,下面开始. 二.spring中的使用 springJDB ...

  5. 23种java设计模式详解-代理模式

    什么是代理模式: Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类, ...

  6. java 中 statent,【行为型模式】状态模式(state)之23种java设计模式

    State接口类 public interface State { void handle(); } BookedState类 /** * 已预订状态 * @author Administrator ...

  7. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  8. java设计模式-16模板模式

    定义 在一个抽象类公开定义了执行它的方法的模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行 模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变 ...

  9. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

最新文章

  1. STM32 基础系列教程 40 - Lwip_mqtt
  2. Transformer architecture的解释
  3. SAP Spartacus 页面元数据
  4. BitNami一键安装Redmine
  5. PyQt5 QTreeWidget更改item项前的展开折叠三角图标
  6. 【2015年第4期】基于电力运营大数据分析实现节能减排
  7. 一本通1613打印文章
  8. eclipse 使用lombok 出现的问题
  9. python登录验证程序_python – 测试Flask登录和身份验证?
  10. vue让元素固定_vue 监听dom元素的滚动事件 实现某元素吸顶或者固定位置显示
  11. 软件开发工程师应该具备哪些证书_初级软件工程师证书简介
  12. 基于vue的前端UI表单设计器
  13. redis配置信息解读
  14. 最基础硬件学习 | 简单闪烁灯制作
  15. uniapp中canvas将矩形图片绘制成圆形图片以及保存canvas到手机
  16. 护眼台灯界的“变形金刚”,性能爆表还帅气十足 | 钛空智慧星球推荐
  17. Perl模块使用 = 简短例子代码集合(转帖)
  18. android屏幕跳转,Android 几种屏幕间跳转的跳转Intent Bundle
  19. 电池内阻及其测量方法
  20. android第三方app改为系统app,加入system组,获取system权限

热门文章

  1. 211大学【合工大】发生通宵考研占座排队!
  2. 教你怎么使用Python对word文档进行操作
  3. OpenGL实验(二三代码整理)桌子
  4. 用sql dts导入mysql数据库,使用命令行导入sql文件到mysql数据库
  5. 穷游网宣布与在线旅游消费金融场景运营方首付游达成战略合作
  6. 如何将ecology本地域名变成公网域名?
  7. 如何解决OneOnte屏幕剪辑热键被占用问题
  8. 动态范围压缩如何改变音频?
  9. Mudbox与ZBrush有什么区别?
  10. Anki 但是Ubuntu