Spring中的模板模式
文章目录
- 前言
- 一、模板模式优缺点?
- 二、代码例子
前言
所谓模板,即定义了一套标准版的骨架,我们需要做的就是在此基础上不断演化新的版本,已达到设计需要。如果要以开发者的编程思维角度去思考这个设计方式,也就是准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。
一、模板模式优缺点?
优点
- 提高代码复用性。将相同部分的代码放在抽象的超类中。
- 提高拓展性。将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为。
- 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制&符合“开闭原则”。
缺点
- 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
二、代码例子
这里,可以举一个例子详细介绍如何在项目中准确的使用模板设计模式。例如生活中我们炒菜需要倒油、热油、倒蔬菜、倒调味料、翻炒这五个步骤,然而倒油、热油以及翻炒这三个步骤是炒菜必须需要做的,也是相同的,而至于炒什么菜,以及这个菜需要放什么调料则是变化的,所以遇到类似这种流程的开发模式时,使用模板模式是最能够有效体现设计模式在程序中的运用。代码如下:
package com.hjh.c_template;
/*** @author hjh*/
public abstract class StirFryTemplate {/*** 模板方法,炒菜的流程* 声明为 final,防止子类重写*/protected final void make() {//第一步:倒油this.pourOil();//第二步:热油this.heatOil();//第三步:倒蔬菜this.pourVegetable();//第四步:倒调味料this.pourSauce();//第五步:翻炒this.fry();}private void pourOil() {System.out.println("向锅里倒油");}private void heatOil() {System.out.println("热油");}/*** 炒什么菜让子类决定*/protected abstract void pourVegetable();/*** 这个菜需要加什么调料由子类决定*/protected abstract void pourSauce();private void fry() {System.out.println("翻炒直到炒熟");}
}
当需要炒土豆时可以写如下代码:
public class FriedPotatoes extends StirFryTemplate {@Overridepublic void pourVegetable() {System.out.println("倒入土豆");}@Overridepublic void pourSauce() {System.out.println("加入土豆的调味料");}
}
当需要炒白菜时可以写如下代码:
public class ChineseCabbage extends StirFryTemplate{@Overridepublic void pourVegetable() {System.out.println("倒入白菜");}@Overridepublic void pourSauce() {System.out.println("加入白菜的调味料");}
}
接下来就可以在Spring框架中,看模板方法模式是如何被Spring使用的,例如,模板方法模式IOC容器初始化的时候就有所应用,我们可以看一下 AbstractApplicationContext 中的 refresh 方法,它就是一个模板方法,里面调用了一系列方法,有以实现的具体方法,有未实现的抽象方法,也有空的钩子方法。这里解释一下何为钩子方法,所谓钩子方法,就是在模板方法模式的抽象类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况来决定是否重写它,该方法则被成为钩子方法。这里源码代码已给出:
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {prepareRefresh();//此方法内部调用了两个抽象方法refreshBeanFactory()和getBeanFactory()//具体要取哪种beanFactory的控制权交给了子类ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();prepareBeanFactory(beanFactory);try {//钩子方法postProcessBeanFactory(beanFactory);invokeBeanFactoryPostProcessors(beanFactory);registerBeanPostProcessors(beanFactory);initMessageSource();initApplicationEventMulticaster();//钩子方法onRefresh();registerListeners();finishBeanFactoryInitialization(beanFactory);finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}destroyBeans();cancelRefresh(ex);throw ex;}finally {resetCommonCaches();}}
}
总之,在开发过程中,我们应该尽量将程序模式化,使用有效的设计模式在我们的程序中能够提高我们程序的可读性以及灵活性。作为开发者,这也是提高我们编程技术的必经之路。
欢迎大家添加个人公众号,一起进步努力。
Spring中的模板模式相关推荐
- Spring中的代理模式
Spring中的代理模式,是Spring中一大核心 AOP(切面编程)的底层实现. 代理模式可分为: 静态代理 动态代理 静态代理 涉及三类角色,简单分析一下: 抽象角色(一般会使用接口或抽象类解决) ...
- 设计模式(三)策略模式——在Spring中使用策略模式
前言 在 设计模式(一)策略模式 -- 策略模式结构 和 设计模式(二)策略模式 -- 在程序中通过枚举使用策略模式 两篇博文中分析了策略模式的基础使用,在实际的项目开发中要结合spring容器使用策 ...
- Spring中的设计模式:模板方法模式
目录 导读 什么是模板模式 优点 缺点 简单演示 Spring中的模板模式 模板抽象类 模板方法 抽象方法 具体子类 总结 导读 文章首发于微信公众号设计模式:模板模式,原创不易,谢谢支持!!! 模板 ...
- 深入理解模板模式及实际应用
2019独角兽企业重金招聘Python工程师标准>>> 原来写了一个博客,记一次Spring环境使用模板模式.用了之后美滋滋.但是通过这几天的压力测试.发现,都怪自己太年少,太懵懂, ...
- Spring Boot 使用模板引擎
Spring Boot 推荐使用Thymeleaf.FreeMarker.Velocity.Groovy.Mustache等模板引擎.不建议使用JSP. Spring Boot 对以上几种引擎提供了良 ...
- 设计模式-05.01-行为型-观察者模板模式
文章目录 观察者模式[常用] Demo案例-天气预报 方案一 WeatherData CurrentConditions Client 问题分析 观察者模式方案 Subject[接口] Observe ...
- java 模板模式_java设计模式之模板模式
模板模式 模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤.这种类型的设计模式属于 ...
- Java模板模式(template)
java23中设计模式中的模板模式是我们经常在框架源码中能看到的设计模式,所以本文就给大家来介绍下模板模式 模板模式 模板模式介绍 模板方法模式是编程中经常用得到的模式,它定义了一个操作中的算 ...
- 模板模式(template)解析例子
摘要:本文深入浅出的讲述了设计模式中的模板模式,并给出了简单的示例,例子浅显易懂,并附带源代码. 模板模式属于行为型模式,其意图是定义一个操作的算法骨架,而将一些步骤延迟到子类中,可以不改变一个算法的 ...
最新文章
- 初版python计算器
- WCF-学习笔记概述之计算服务(1)
- DK云网关与普通DTU之间的区别
- .NET Core使用gRPC打造服务间通信基础设施
- Hadoop解决内存受限问题
- 虚拟机网卡的相关知识
- (06)vtk修改默认鼠标操作,实现鼠标按键控制模型旋转
- 一个按键控制数码管的开和关_单片机是否能用一个按键控制数码管的显示图?...
- 38.Linux/Unix 系统编程手册(下) -- 编写安全的特权程序
- mysql split 分割文件名_【原】mysql5.6 split函数_字符串的分割
- 9、两个栈实现队列(Python)
- java 泛型对象实例化_java泛型对象的实例化
- 如何构建config文件
- php库函数是什么,PHP常用库函数
- 数据分析师15-面试全流程
- java创建exchange邮箱_创建Exchange邮箱用户
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
- 基于STM32的ESP8266天气时钟(1)---------AT指令获取天气数据
- 在h5页面中调起支付宝小程序中的某一个页面以及URLScheme 之 支付宝
- 高新科技企业税收优惠有多少