一、模板模式的应用场景

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

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

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

public abstract class PutThingIntoFrigCourse {

    protected final void createCourse() {
//是否需要对大块的东西进行切割
if (needCut()) {
this.cut();
}
//打开冰箱门
this.openDoor();
//把东西放进去
this.putThingIntoFrig();
//关闭冰箱门
this.closeDoor();
} //钩子方法:对步骤进行微调
protected boolean needCut() {
return false;
} //钩子方法:就是通过返回值对模板类内部进行修改
abstract String thing(); final void cut() {
System.out.println("切碎" + thing());
} final void openDoor() {
System.out.println("打开冰箱门");
} final void putThingIntoFrig() {
System.out.println("把" + thing() + "放冰箱");
} final void closeDoor() {
System.out.println("关闭冰箱门");
}
}

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

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

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

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

  可以发现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. @noi.ac - 170@ 数数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 求有多少对 1 ∼ n 的排列 (a, b) 满足 \(m \l ...

  2. 理解虚拟主机与VPS,云服务器CVM与云服务器ECS的区别

    1.理解虚拟主机与VPS的区别:VPS与虚拟主机的区别 2.理解云服务器CVM与云服务器ECS的区别:云服务器CVM与云服务器ECS的区别 3.锐速安装一键包

  3. LRJ-Example-06-12-Uva572

    #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <string ...

  4. ccf-201403-3有趣的命令行

    傻逼题,要是考试只能得0分.. 提供几组傻逼数据,这要是在真实的生活中一定是错的... 还是要好好读题吧,全凭自己的感觉就得0分 albw:x 4 ls -a docu Case 1: -a ls - ...

  5. uva 100 The 3n + 1 problem (RMQ)

    uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= ...

  6. H3C ISDN DCC备份配置示例

  7. UVA 3027 Corporative Network 带权并查集、

    题意:一个企业要去收购一些公司把,使的每个企业之间互联,刚开始每个公司互相独立 给出n个公司,两种操作 E I:询问I到I它连接点最后一个公司的距离 I I J:将I公司指向J公司,也就是J公司是I公 ...

  8. Python--day25--面向对象之封装

    狭义上的封装的例子:(例1)Python就只有两种类型:公有和私有,没有Java中说的那种保护类型 例2: 例3:正常的方法调用私有方法 封装总结:

  9. Python--day25--复习(单继承和多继承的总结)

  10. 【9307】&【a303】过河卒(NOIP2002)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...