一、概念

模板设计模式—基于抽象类的,核心是封装算法

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现,使用模板方法模式有Spring、Servlet、AQS等

在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。模板模式使得子类在不改变算法结构的基础上,重新具体定义算法中的某些步骤,提高代码复用性。

优点

使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求

缺点

如果算法骨架有修改的话,则需要修改抽象类

步骤

1、先将主流程框架逻辑(清点商品/计算价目/结算/送货上门)设计完成

2、再实现各模块小步骤。

3、不能确实的步骤,作为虚拟方法,甩锅给子类实现。

4、子类只需要聚焦自己的小步骤逻辑。

讲模板设计模式之前,我们用代码来实现咖啡和茶制作的类:

普通类写法

public class MakeDrink {public static void main(String[] agrs) {Coffee coffee = new Coffee();coffee.makeCoffee();System.out.println("~~~~~~");Tea tea = new Tea();tea.makeTea();}
}
//制作咖啡
class Coffee {//make coffeevoid makeCoffee() {boilWater();brewCoffeeGrings();pourInCup();addSugarAndMilk();}// setp1:public void boilWater() {System.out.println("将水煮沸");}// setp2:public void brewCoffeeGrings() {System.out.println("冲泡咖啡");}// setp3:public void pourInCup() {System.out.println("把咖啡倒进杯子中");}// setp4:public void addSugarAndMilk() {System.out.println("加糖和牛奶");}
}
// 制作茶
class Tea {//make teavoid makeTea() {boilWater();steepTeaBag();pourInCup();addLemon();}// setp1:public void boilWater() {System.out.println("将水煮沸");}// setp2:public void steepTeaBag() {System.out.println("浸泡茶叶");}// setp3:public void pourInCup() {System.out.println("把茶倒进杯子中");}// setp4:public void addLemon() {System.out.println("加柠檬");}
}

我们在coffee和Tea两个类中发现了重复代码,因此我们需要重新理一下我们的设计。

既然茶和咖啡是如此的相似,因此我们应该将共同的部分抽取出来,放进一个基类中。从冲泡法入手。观察咖啡和茶的冲泡法我们会发现,两种冲泡法都采用了相同的算法:

  • 将水煮沸
  • 用热水泡饮料
  • 把饮料倒进杯子
  • 在饮料内加入适当的调料

实际上,浸泡(steep)和冲泡(brew)差异并不大。因此我们给它一个新的方法名称brew(),这样我们无论冲泡的是何种饮 料都可以使用这个方法。

同样的,加糖、牛奶还是柠檬也很相似,都是在饮料中加入其它调料,因此我们也给它一个通用名称addCondiments()。

另外,不管泡咖啡还是冲茶,其实都是做饮品,我们改算法的名字为makingDrinks

模版方法设计模式

/*** 模板方法设计模式*/
public class TemplateMethodPatternTest1 {/*** 模版方法抽象类*/abstract class DrinkProduction {/***  生产饮料的步骤*  final禁止子类重写*/public final void makingDrinks() {boilWater();brew();pourInCup();addCondiments();}/*** 步骤一:烧水*/public void boilWater() {System.out.println("将水煮沸");}/*** 步骤二:加主料* 强制子类实现*/public abstract void brew();/*** 步骤三:倒入茶杯*/public void pourInCup() {System.out.println("倒入杯子里");}/*** 步骤四:加佐料* 强制子类实现*/public abstract void addCondiments();}// 做咖啡class Coffee extends DrinkProduction {@Overridepublic void addCondiments() {System.out.println("添加牛奶和糖");}@Overridepublic void brew() {System.out.println("加入coffee煮");}}// 做茶class Tea extends DrinkProduction {@Overridepublic void addCondiments() {System.out.println("加入柠檬");}@Overridepublic void brew() {System.out.println("加入茶叶煮");}}public void test(){Coffee coffee = new Coffee();coffee.makingDrinks();System.out.println("~~~~~~");Tea tea = new Tea();tea.makingDrinks();}public static void main(String[] args) {TemplateMethodPatternTest1 tem = new TemplateMethodPatternTest1();tem.test();}
}

uml图

在模板设计模式下还有一种钩子用法

钩子方法是一类"默认不做事的方法" ,子类可以视情况决定要不要覆盖它们。

比如说,泡茶的时候,最后一步不用加柠檬

/*** 有钩子的模版方法设计模式*/
public class TemplateMethodPatternTest2 {/*** 模版方法抽象类*/abstract class DrinkProduction {/***  生产饮料的步骤*  final禁止子类重写*/public final void makingDrinks() {boilWater();brew();pourInCup();//钩子决定是否调用if(isAddCondiments()) {addCondiments();}}/*** 步骤一:烧水*/public void boilWater() {System.out.println("将水煮沸");}/*** 步骤二:加主料*/public abstract void brew();/*** 步骤三:倒入茶杯*/public void pourInCup() {System.out.println("倒入杯子里");}/*** 步骤四:加佐料*/public abstract void addCondiments();/*** 钩子写法* 如果不需要就对这个方法重写* @return*/public boolean isAddCondiments(){return true;}}class Coffee extends DrinkProduction {@Overridepublic void brew() {System.out.println("加入coffee继续煮");}@Overridepublic void addCondiments() {System.out.println("添加牛奶和糖");}}class Tea extends DrinkProduction {@Overridepublic void brew() {System.out.println("加入茶叶煮");}// 不需要实现,空方发即可@Overridepublic void addCondiments() {}@Overridepublic boolean isAddCondiments(){return false;}}public void test(){Coffee coffee = new Coffee();coffee.makingDrinks();System.out.println("~~~~~~");Tea tea = new Tea();tea.makingDrinks();}public static void main(String[] args) {TemplateMethodPatternTest2 tem = new TemplateMethodPatternTest2();tem.test();}
}

二、分析jdbcTemplate的模板方法设计模式用法

(15)模版方法设计模式相关推荐

  1. 设计模式 模版方法模式 展现程序员的一天

    继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...

  2. 设计模式(九)模版方法模式

    相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 设计模式(七)装饰模式 ...

  3. .NET设计模式(16):模版方法(Template Method)

    概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识 ...

  4. 设计模式——模版方法

    一.首先记住什么模版方法模式(看后面的代码理解): 模版方法模式指在一个方法,里面包含了一个多步骤的算法骨架,其中一个或者多个步骤允许子类延后实现.允许子类在不修改算法的结构的 前提下,对一个或多个步 ...

  5. 设计模式(三)模版方法(行为型)

    模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的 ...

  6. 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  7. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

  8. 设计模式培训之七:模版方法

    查看本人文章索引请通过http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html 一.定义 定义一个操作中的算法的骨架,而将一些步 ...

  9. 设计模式-模版方法模式

    定义 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现. 模版方法使子类在不改变算法结构的情况下,重新定义算法的某些步骤 使用场景 一次性实现算法的不变部分,将可变的行为留给子类来实现 各子类 ...

最新文章

  1. Java非线程安全问题的解决方法
  2. PLSQL_基础系列11_递归和层次查询CONNECT BY(案例)
  3. html5表单动态添加,js动态添加表单实例
  4. Object类有哪些公用方法?
  5. 终端编译opengl程序编译运行_ubuntu编译opengl和demo之二(glfw版本)
  6. DNN: ModuleSettings Vs TabModuleSettings
  7. TensorFlow 教程 --新手入门--1.1简介
  8. ubuntu16.4安装部署过程
  9. nginx负载均衡器处理session共享的几种方法(转)
  10. 【气动学】基于matlab GUI外弹道仿真系统【含Matlab源码 1044期】
  11. 深入浅出BP神经网络算法的原理
  12. sqlite3用法详解
  13. PDF能编辑吗,PDF文件怎么拆分页面
  14. 用计算机术语形容人性格的词语,电脑桌创意广告词——关于电脑桌的广告语
  15. js 验证身份证格式
  16. 分布式Zookeeper-基础
  17. 【数学知识】非线性方程求解的二分法以及牛顿迭代法
  18. 机器人笔记psv中文_《机器人笔记》白金攻略 机器人笔记奖杯攻略
  19. 在hb中html怎么插图片,WKWebView加载HTML文本(图片自适应)
  20. 移动网关贝尔G-140W-C 修改wifi前缀去掉CMCC

热门文章

  1. 基于selenium的自动化测试脚本编写-python
  2. Docker新手急速入门
  3. 教你用这个技巧问薪资,HR不反感!
  4. 虚拟环境的作用及搭建
  5. 记录ES删除字段方法
  6. 【电脑网络突然断开】电脑wifi显示无网络连接,手机可以正常联网
  7. unity制作小游戏
  8. 宝宝的css,CSS3 卡通版太阳宝宝
  9. Java本地远程服务器debug调试详解
  10. 数据解读 | 想要与北上争雄,深圳还有哪些课要补?