在讲模板模式原理前,我们按照惯例,先来个生活中例子。茶馆需要开发一个自动的泡咖啡和泡茶的程序。

来源:凯哥Java(kaigejava)

我们先来看看泡咖啡和泡茶的步骤:

我们根据上图写代码实现:

泡咖啡类,如下图:

泡茶类如下图:

测试类:

运行结果:

很简单。也很容易写出来。写出来很清楚。

从上图中,可以发现,两个流程几乎是一样的套路(步骤)。其中,不变的部分:水烧开、倒入杯子、送给客人。这三步是不变的。

变化的是:冲咖啡还是泡茶叶;加糖/牛奶还是加柠檬这两个步骤是变化的。

项目进化第一个版本:

我们将不变的抽取出来,放到一个公共的类中。HotDrink。然后让coffe和tea都继承公共的类。得到的类图如下:

hotdrink超类代码如下:

项目进化第二个版本:

经过分析,我们发现,两个流程的还有相同的地方:

1.两个流程的步骤都一样(都是五个步骤的);

2.无论泡茶还是泡咖啡都是brew操作;

3.无论加糖还是加柠檬都是添加调料的。

所以,我们对项目在进行一次提取:

我们将操作流程也提取到超类中,将2和3操作也放到超类中。让子类具体实现。所以得到类图如下:

我们来看看这次hotdrink类里面:

public abstract classHotDrink {

public final voidprepareRecipe(){

boilWater();

brew();

pourInCup();

addCondiments();

send();

}

protected abstract voidaddCondiments();

protected abstract voidbrew();

private final voidboilWater() {

System.out.println("一.烧水");

}

private final voidpourInCup() {

System.out.println("三.倒入杯中");

}

我们发现,在prepareRecipe方法和boilWter、pourInCup、send这四个操作都添加了final关键字来修改。这是为什么呢?

从上面分析,我们知道,都是五个步骤,而且五个步骤中的三个步骤(烧水、倒入杯中、送客人)也是固定不变的。那么,在Java中,固定不变的这个怎么表示呢?对了,就使用fianl这个关键字修饰就可以了。这样,就可以放置子类不能随便修改步骤(比如由五步变成三步),已经规定的不能在修改了。比如烧水这个不烧了,这样是不行的。

我们来看看,热饮coffee和tea的类:

hotDrinkTea:

测试方法:

运行结果:

我们对项目进化进行复盘总结,可以得到:

所谓的模板模式:封装了一个算法的步骤,并允许子类为一个或多个步骤方法提供实现。模板模式,可以使子类在不改变算法结构(如上面的五步)的情况下,重新定义算法中某些步骤(如上面的第二步和第四步)

模板模式类图如下:

类图说明:

1:是一个抽象类(如:hotDrink)

2:有个模板方法。这个模板方法是final的(如:prepareRecipe方法)

3:由三种方法:

AbsOperation:抽象的方法(泡咖啡、加牛奶)

concreteOp:具体的方法(如烧水。可以是final的也可以不是)

hook:钩子。可以选的子类可以覆盖父类的方法。

我们来演示下带有hook的。

比如,现在有了新需求,客户可以自己选择需不需要添加调料。这个怎么做呢?

我们从新定义模板:

tea实现了该模板类,并且不加柠檬的:

测试运行:

结果:

java中引导页面的,设计模式之模板模式引导篇相关推荐

  1. java中刷新页面的js,[Java教程]js页面刷新之实现框架内外刷新(整体、局部)

    [Java教程]js页面刷新之实现框架内外刷新(整体.局部) 0 2016-10-12 12:00:56 这次总结的是框架刷新: 框架内外的按钮均可以定义网页重定向, 框架内部页面的按钮可以实现局部刷 ...

  2. 移动端引导页UI设计临摹模板,ui设计师进阶必备

    通俗点来讲引导是带领用户更快速更愉悦地达到目标的过程,能在用户使用产品遇到障碍之前给予及时的帮助.在移动互联网的产品的设计中,新手引导的设计则是在用户初次使用该移动产品时,给予的一些必须性的帮助以使得 ...

  3. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  4. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

  5. 墨渊第十七版引导页源码 彩虹云任务引导页模板

    介绍: 彩虹云任务引导页: 1.大部分静态文件使用360的CDN,加快浏览速度 2.全局响应式界面,加倍体验 3.标题.关键词,介绍均在后台设定 4.适合彩虹云任务V7.X系列 使用教程: 上传网站根 ...

  6. 设计模式回顾——模板模式(C++)

    文章目录 1 前言 2 什么是模板模式 2.1 模板模式组成 2.2 模板模式UML图 2.3 模板模式作用 3 模板模式优缺点 4 什么地方使用模板模式 5 模板模式实现 6 模板模式与策略模式比较 ...

  7. java中selenium设置chrome浏览器为开发者模式与IP代理

    java中selenium设置chrome浏览器为开发者模式与IP代理 前言 代码 前言 之前为公司写了个爬虫项目,有时候为了绕过网站的反爬机制需要用到ip代理以及设置浏览器为开发者模式,看了一些se ...

  8. 23种设计模式之模板模式

    文章目录 概述 模版模式的优缺点 优点 缺点 模版模式的使用场景 模板模式的结构和实现 模式结构 模式实现 总结 概述 模板模式指:一个抽象类中,有一个主方法,再定义1-n个方法,可以是抽象的,也可以 ...

  9. java中引导页面的,Android实现欢迎引导页面

    现在的大多数应用都会有一个欢迎引导页面, 需求分析: 程序安装后第一次启动: 启动页-->功能引导页-->应用主页 以后启动: 启动页-->应用主页 实现原理: 用SharedPre ...

最新文章

  1. 1112: 零起点学算法19——输出特殊值
  2. ActiveX(五)更好的“ActiveX”?
  3. html中h3的样式,比较好看的css自定义样式(标题 h1 h2 h3)
  4. [BZOJ2179]FFT快速傅立叶
  5. boost::core::typeinfo的用法实例
  6. [深度学习]Ubuntu16.04 + GTX 1050 + cuda8.0 + cuDNN5.1 + caffe安装详解
  7. java nio改造io,java – 将NIO与IO混合
  8. 马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP
  9. Java的内存模型,java初级面试笔试题
  10. 为LogAnalyzer添加源IP
  11. php用手机摇一摇,H5做出手机摇一摇功能的实现步骤
  12. 公式中的引号怎么输_Excel计数函数中这些奇怪的参数让我百思不得其解!
  13. 文献管理三剑客之Noteexpress:更新一次文献后把文献自动插一次
  14. 威纶通触摸屏部分元件下载后不显示且编辑时无法选择
  15. spfa算法(c++)
  16. mysql有rollup函数_如何在MySQL ROLLUP函数中替换NULL类别标题?
  17. 电脑上计算机软件一直自动弹出,拨号连接自动弹出,详细教您如何解决电脑总是自动弹出...
  18. MOTO 国行ME525升级Android2.3.4教程
  19. 我的世界基岩版超简单红石教程3
  20. 网络编程学习(10)/ FTP项目(4) ——文件下载和下载断点续存功能

热门文章

  1. ### Error building SqlSession.### The error may exist in entity/UserMapper.xml
  2. java 方法重载 应用举例,Java 实例 - 重载(overloading)方法中使用 Varargs
  3. 期末考试前的预习,科目:化工设备与反应器(6)
  4. 五十七、教用Python中的turtle海龟画图(下篇)
  5. sklearn特征的提取(上)
  6. 自监督学习的发展趋势:事半功倍的模型训练和数据效能
  7. 直播 | 腾讯天衍实验室张子恒:详细解读天衍实验室知识图谱对齐技术
  8. 长篇问答任务(LFQA)的发展面临哪些阻碍?
  9. 基于深度学习的多目标跟踪算法——ReID与MOT的联系
  10. LeetCode刷题:滑动窗口模板以及典型例题