Spring中常见的设计模式——模板模式
一、模板模式的应用场景
模板模式又叫模板方法模式(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中常见的设计模式——模板模式的更多相关文章
- Spring中常见的设计模式——代理模式
一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...
- Spring中常见的设计模式——策略模式
策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...
- Spring中常见的设计模式——委派模式
一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...
- Spring中常见的设计模式——工厂模式
一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...
- Spring中常见的设计模式——原型模式
1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...
- Spring中常见的设计模式——适配器模式
一.适配器模式的应用场景 适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期待的另一个接口,使原本接口不兼容的类可以一起工作,属于构造设计模式. 适配器适用于以下几种业务场景: ...
- Spring中常见的设计模式——单例模式
一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...
- 设计模式:JDK和Spring中常见的设计模式
设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...
- spring 中常用的设计模式
一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...
随机推荐
- 2018-8-10-WPF-使用-VisualStudio-2017-项目文件
title author date CreateTime categories WPF 使用 VisualStudio 2017 项目文件 lindexi 2018-08-10 19:16:53 +0 ...
- fastclick使用与 fastclick ios11.3相关bug原因(ios输入框点击变得不灵敏,ios input失焦后,页面上移,点击不了)
FastClick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,就有了FastClick. 安装fastc ...
- js用for循环模拟数组翻转
文章地址 https://www.cnblogs.com/sandraryan/ js本身为数组提供了reverse()方法,可以翻转数组,返回一个新的数组,不影响原数组. 本例中用for循环简单模拟 ...
- 梯度下降优化算法综述与PyTorch实现源码剖析
现代的机器学习系统均利用大量的数据,利用梯度下降算法或者相关的变体进行训练.传统上,最早出现的优化算法是SGD,之后又陆续出现了AdaGrad.RMSprop.ADAM等变体,那么这些算法之间又有哪些 ...
- codeforces1217-edu
C The Number Of Good Substrings 我原来的基本思路也是这样,但是写的不够好 注意算前缀和的时候,字符串起始最好从1开始. #include<cstdio> # ...
- -Bash: Unzip: Command Not Found解决方法 安装unzip
利用unzip命令解压缩的时候,出现-bash: unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip.利用一句命令就可以解决了. 命令 ...
- PyTorch里面的torch.nn.Parameter()
在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...
- 彻底解决tensorflow:ImportError: Could not find 'cudart64_90.dll' tensorflow安装
今天装tensorflow-gpu出现了很多问题 1.pip install tensorflow-gpu下载过慢 解决办法可查看 Python机器学习常用模块 2.安装完tensorflow以后,运 ...
- laravel-admin新手的使用
1.添加页面 配置好laravel-admin的模板后 点击管理员管理里的菜单列表,输入如下信息即可 提交之后刷新页面,左侧菜单就会显示新增的广告管理的标签 2.定义路由 配置好前端的页面显示之后就要 ...
- PC端页面如何调用QQ进行在线聊天?
pc端如何实现QQ在线咨询? html代码如下: <a href="tencent://message/?uin=1234567&Site=Sambow&Menu=ye ...