一、模板模式的应用场景

  模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结果的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:

  • 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

  把东西装冰箱的步骤模板:

  1. public abstract class PutThingIntoFrigCourse {
  2.  
  3. protected final void createCourse() {
  4. //是否需要对大块的东西进行切割
  5. if (needCut()) {
  6. this.cut();
  7. }
  8. //打开冰箱门
  9. this.openDoor();
  10. //把东西放进去
  11. this.putThingIntoFrig();
  12. //关闭冰箱门
  13. this.closeDoor();
  14. }
  15.  
  16. //钩子方法:对步骤进行微调
  17. protected boolean needCut() {
  18. return false;
  19. }
  20.  
  21. //钩子方法:就是通过返回值对模板类内部进行修改
  22. abstract String thing();
  23.  
  24. final void cut() {
  25. System.out.println("切碎" + thing());
  26. }
  27.  
  28. final void openDoor() {
  29. System.out.println("打开冰箱门");
  30. }
  31.  
  32. final void putThingIntoFrig() {
  33. System.out.println("把" + thing() + "放冰箱");
  34. }
  35.  
  36. final void closeDoor() {
  37. System.out.println("关闭冰箱门");
  38. }
  39. }

  这里面的钩子方法主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务需求,钩子方法通过返回值对主流程进行控制。

二、模板模式在源码中的体现 

  JDBCTemplate看这个名字就知道了。再看JDK中的AbstractList类的代码:

  1. public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
  2. ...
  3. abstract public E get(int index);
  4. ...
  5. }

  可以发现get()方法是一个抽象方法,交给子类实现,比如ArrayList就是AbstractList的子类。还有HttpServlet,有三个方法:service()、doGet()、doPost() 都是模板方法的抽象实现。

  在Mybatis框架中有一个BaseExecutor类,它是一个基础的sql执行类,实现了大部分SQL的执行逻辑,然后把几个方法交给子类定制化完成。

三、模板模式的优缺点

  优点:

  • 利用模板模式将相同处理逻辑的代码放在抽象父类中,可以提高代码的复用性。
  • 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
  • 把不变的行为卸载父类中,除去子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

  缺点:

  • 每个抽象类都需要一个子类实现,导致类的数量增加。
  • 类数量的增加间接的增加了系统复杂性。
  • 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。

Spring中常见的设计模式——模板模式的更多相关文章

  1. Spring中常见的设计模式——代理模式

    一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...

  2. Spring中常见的设计模式——策略模式

    策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...

  3. Spring中常见的设计模式——委派模式

    一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...

  4. Spring中常见的设计模式——工厂模式

    一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...

  5. Spring中常见的设计模式——原型模式

    1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...

  6. Spring中常见的设计模式——适配器模式

    一.适配器模式的应用场景 适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期待的另一个接口,使原本接口不兼容的类可以一起工作,属于构造设计模式. 适配器适用于以下几种业务场景: ...

  7. Spring中常见的设计模式——单例模式

    一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...

  8. 设计模式:JDK和Spring中常见的设计模式

    设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...

  9. spring 中常用的设计模式

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

随机推荐

  1. centos下iptables使用

    iptables的使用规则: 1.表    (table) 包含4个表(哪个表是当前表取决于内核配置选项和当前模块):4个表的优先级由高到低:raw-->mangle-->nat--> ...

  2. 微信小程序封装自定义弹窗

    最近在做小程序的登录,需要同时获取用户手机号和头像昵称等信息,但是小程序又不支持单个接口同时获取两种数据,因此想到自定义一个弹窗,通过弹窗按钮触发获取手机号事件.记录一下. 具体代码如下: 业务代码中 ...

  3. supersockets扩展服务器配置

    关键字: 扩展配置, 自定义配置, 自定义属性, GetChildConfig, 读取配置,子节点 当你使用 SuperSocket 实现 Socket 服务器的时候,不可避免的需要在配置文件中定义一 ...

  4. jq实现简单购物车增删功能

    https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...

  5. BraveOS正式版发布,希望大家下载使用

    废话不多说,直接贴图才是王道 这里是DOS系统+默认官方(Platform系统) 下载地址:http://pan.baidu.com/s/1eQINwx8 (引导进Platform系统后,默认管理员帐 ...

  6. H3C 配置RIP peer

  7. Python--day23--组合

  8. 添加gitignore文件后使其生效

    https://www.cnblogs.com/AliliWl/p/7880243.html 遇到的问题 我们发现在添加.gitignore文件后,当我们想push文件的时候,我们声明的忽略文件还是会 ...

  9. Codeforces 1100F(离线 or 在线)

    传送门 •参考资料 [1]:在线线性基 [2]:离线线性基 [3]:离线线性基 •题意 给你 n 个数,m 次询问: 每次询问给定一个区间 $l,r$,求 $a_{l \cdots r}$ 异或的最大 ...

  10. 基于Springboot+Junit+Mockito做单元测试

    前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...