本文转载自:设计模式:模版模式(Template Pattern)    http://meigesir.iteye.com/blog/1506484 感谢分享

模版模式

又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。

我们使用冲泡咖啡和冲泡茶的例子

加工流程:

咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶

茶冲泡法:   1.把水煮沸、2.用沸水冲泡茶叶、3.把  茶 倒进杯子、4.加蜂蜜

实践步骤:

1>创建一个模板(抽象)类:Beverage(饮料)

Java代码  
  1. package com.kaishengit.beverage;
  2. public abstract class Beverage {
  3. /**
  4. * 冲泡咖啡或茶...流程
  5. */
  6. public final void create(){
  7. boilWater();//把水煮沸
  8. brew();//用沸水冲泡...
  9. pourInCup();//把...倒进杯子
  10. addCoundiments();//加...
  11. }
  12. public abstract void addCoundiments();
  13. public abstract void brew();
  14. public void boilWater() {
  15. System.out.println("煮开水");
  16. }
  17. public void pourInCup() {
  18. System.out.println("倒进杯子");
  19. }
  20. }

2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类

1.咖啡(Coffee)

Java代码  
  1. package com.kaishengit.beverage;
  2. public class Coffee extends Beverage{
  3. @Override
  4. public void addCoundiments() {
  5. System.out.println("添加糖和牛奶");   }
  6. @Override
  7. public void brew() {
  8. System.out.println("用水冲咖啡");
  9. }
  10. }

2.茶(Tea)

Java代码  
  1. package com.kaishengit.beverage;
  2. public class Tea extends Beverage{
  3. @Override
  4. public void addCoundiments() {
  5. System.out.println("添加蜂蜜");
  6. }
  7. @Override
  8. public void brew() {
  9. System.out.println("用水冲茶");
  10. }
  11. }

3.我们测试一下:

Java代码  
  1. package com.kaishengit.beverage;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Coffee coffee = new Coffee();
  5. coffee.create();//冲泡咖啡
  6. //Tea tea = new Tea();//冲泡茶
  7. //tea.create();
  8. }
  9. }

运行结果:

-----------------------------------

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

-----------------------------------

在模版模式中使用挂钩(hook)

存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。

1>我们对模板类(Beverage)进行修改

Java代码  
  1. package com.kaishengit.beverage;
  2. public abstract class Beverage {
  3. /**
  4. * 冲泡咖啡或茶...流程
  5. */
  6. public final void create(){
  7. boilWater();//把水煮沸
  8. brew();//用沸水冲泡...
  9. pourInCup();//把...倒进杯子
  10. addCoundiments();//加...
  11. hook();//挂钩
  12. }
  13. //空实现方法
  14. public void hook(){}
  15. public abstract void addCoundiments();
  16. public abstract void brew();
  17. public void boilWater() {
  18. System.out.println("煮开水");
  19. }
  20. public void pourInCup() {
  21. System.out.println("倒进杯子");
  22. }
  23. }

2>假如我们搞活动,喝一杯咖啡送一杯,修改咖啡(Coffee)类

Java代码  
  1. package com.kaishengit.beverage;
  2. public class Coffee extends Beverage{
  3. @Override
  4. public void addCoundiments() {
  5. System.out.println("添加糖和牛奶");   }
  6. @Override
  7. public void brew() {
  8. System.out.println("用水冲咖啡");
  9. }
  10. /**
  11. * 挂钩
  12. */
  13. @Override
  14. public void hook() {
  15. System.out.println("再来一杯");
  16. }
  17. }

3>使用上面的测试类

运行结果:

--------------------------------

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

再来一杯

--------------------------------

结果中有“再来一杯”...

我们也可以这样使用挂钩,让其决定里面的代码是否执行

1>我们对模板类(Beverage)进行修改

Java代码  
  1. package com.kaishengit.beverage;
  2. public abstract class Beverage {
  3. /**
  4. * 冲泡咖啡或茶...流程
  5. */
  6. public final void create(){
  7. boilWater();//把水煮沸
  8. brew();//用沸水冲泡...
  9. pourInCup();//把...倒进杯子
  10. //挂钩决定是否添加配料
  11. if(hook()){
  12. addCoundiments();//加...
  13. }
  14. //hook();
  15. }
  16. /**
  17. * 默认添加配料
  18. * @return
  19. */
  20. public boolean hook() {
  21. return true;
  22. }
  23. //public void hook(){}
  24. public abstract void addCoundiments();
  25. public abstract void brew();
  26. public void boilWater() {
  27. System.out.println("煮开水");
  28. }
  29. public void pourInCup() {
  30. System.out.println("倒进杯子");
  31. }
  32. }

2>我们对Coffee类进行修改,让其不添加配料

Java代码  
  1. package com.kaishengit.beverage;
  2. public class Coffee extends Beverage{
  3. @Override
  4. public void addCoundiments() {
  5. System.out.println("添加糖和牛奶");   }
  6. @Override
  7. public void brew() {
  8. System.out.println("用水冲咖啡");
  9. }
  10. /**
  11. * 有的客人不喜欢加配料
  12. */
  13. @Override
  14. public boolean hook() {
  15. return false;
  16. }
  17. /*@Override
  18. public void hook() {
  19. System.out.println("再来一杯");
  20. }
  21. */
  22. }

3>还是使用上面的测试类

运行结果:

------------------------------------------------------

煮开水

用水冲咖啡

倒进杯子

------------------------------------------------------

运行结果中没有添加配料

关于模板模式

1>模板模式定义了算法的步骤,把这些步骤的实现延迟到子类

2>模板模式为我们提供了一个代码复用的技巧

3>模板抽象类中可以定义具体方法、抽象方法和钩子方法

4>为了防止子类改变模板中的算法,可以将模板方法声明为final

5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它

模版模式(Template Pattern)相关推荐

  1. 7.1 模板方法模式 (Template Pattern)

    零. 行为型模式概述 1.定义 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个独个对象都无法单独完成的任务,它涉及算法与对象间职责的分配.行为型模式分为类 ...

  2. 不重复发明轮子 -- 模板模式 (Template Pattern) 介绍 使用场景案例分析 优缺点 及代码演示

    一句话概括: 一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以重写方法实现,但调用将以抽象类中定义的方式进行. 补充介绍: 模板模式(Template Pattern)使得子类可以不改变一个 ...

  3. 模板模式-Template Pattern

    一.定义 二.结构 三.实现 四. mybatis模板模式浅探之BaseExecutor 一.定义 一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义 ...

  4. 抽象类,模版模式和接口

    抽象类,模版模式和接口 抽象类 抽象类的特点 抽象类不可以被实例化 什么时候使用抽象类 抽象类和普通类的区别 抽象类的作用 模板模式 什么是模板模式 何时使用 优点 缺点 分析 类和类之间的耦合问题 ...

  5. 行为型模型 模版模式

    行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:         - 具有统一的操作步骤或操作过程         - 具有不同的操作细节     ...

  6. java 访客模式,设计模式 - 访客模式( Visitor Pattern)

    设计模式 - 访客模式( Visitor Pattern) 在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法. 通过这种方式,元素的执行算法可以随着访问者的变化而变化. 此模式属于行 ...

  7. Net设计模式实例之模板方法模式(Template Mothed Pattern)(1)

    一.模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不 ...

  8. 模版方法模式/Template Method

    模版方法模式/Template Method 意图/适用场景: 模版方法模式其实是一种应用很广泛的模式,特别是在使用抽象类的时候. 模版方法模式中必然有一个核心的抽象类,不能是接口.声明一些抽象方法, ...

  9. 3.5 模板模式(Template Pattern) -《SSM深入解析与项目实战》

    文章目录 3.5 模板模式(Template Pattern) 3.5.1 策略模式与模板模式 3.5.2 场景实例 抽象模板角色&具体模板角色 抽象模板类 具体模板角色 测试类 演示结果 总 ...

最新文章

  1. android数据库查找一个字符,Android - 如何在Firebase数据库中对字符串进行简单搜索?_android_开发99编程知识库...
  2. 面试不怂之redis与缓存大全
  3. 实例12:python
  4. oracle 数字类型行转列,oracle行转列
  5. 【CCF】 201809-1 卖菜
  6. 从400+节点ElasticSearch集群的运维中,我们总结了这些经验
  7. B树的原理以及C++实现(附源码和文档)
  8. [转]RTH试用手记之“额外功能”
  9. 苹果平板有Linux终端吗,Apple:如何在iphone、ipad上安装一些常用命令行命令
  10. 卸载vs2015社区版本然后装vs2015专业版本出现问题ActivityLog.xml错误
  11. 语文音乐计算机的英语怎么读,音乐英语怎么读
  12. 微信小程序 长按事件 删除图片
  13. [Docker]进入容器命令
  14. 最大元和最小元(直接求解法和分治法)
  15. AVT工业相机Windows、Opencv开发——驱动相机(超详细)
  16. 实现一下模式识别(三)FLD
  17. AI窥人(二):彻底“AI化”怎么样?
  18. 解决Maven安装Tomcat插件后,使用出现8080端口占用的问题
  19. 重构产品负责人:SPO / TPO模型
  20. 图像傅里叶变换及滤波

热门文章

  1. usb设备的检测及区分(sata硬盘、优盘及移动硬盘)
  2. 当AI可以无痕换脸,一次面部信息的泄露,将会带来无法想象的危机。
  3. 【考研经验】22西电网信考研上岸经验分享
  4. 对学校的希望和寄语_对母校的寄语
  5. 论文笔记:Attention is All You Need
  6. PS把照片横向切成5片,并全部保存成JEPG
  7. 我的人生应该踏实一点
  8. 人生情长特别栏目《大姐的幸福》定制护肤还原肌肤本态
  9. 测试肌肤的软件可信吗,皮肤检测仪可靠吗
  10. 虚拟机设置固定IP,以及解决设置固定IP后不能上网的问题