Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java设计模式之模板模式,站在巨人的肩膀上成功

java设计模式之模板模式,站在巨人的肩膀上成功

作者头像
用户4361942
发布于 2019-05-24 09:03:42
发布于 2019-05-24 09:03:42
1.4K00
代码可运行
举报
文章被收录于专栏:java程序员思维java程序员思维
运行总次数:0
代码可运行

模板模式

模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。

模板模式解决的问题

一些方法通用,却在每一个子类都重新写了这一方法,带来大量重复的代码的问题。相同的部分父类给出统一的模板,不同的部分,子类进行重写。

命令模式模式角色

AbstractTemplate(抽象类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

ConcreteTemplate(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

模板抽象类方法类型

抽象方法:在抽象类声明、由其具体子类实现。

具体方法:在抽象类中声明并实现,在具体子类中可以继承或重写。

钩子方法:在抽象类中声明并实现(可以是空的实现),子类视情况进行重写覆盖,一般是逻辑判断方法。

模板方法:定义统一模板算法的方法,提供实现方法,子类一般不需要重写。

模板模式和策略模式的区别

模板模式定义了一个统一的算法,子类可以对算法的某一些步骤,进行覆盖重写,可以提高代码的复用率。同过继承的方式实现,依赖比较强,不够灵活。策略模式每个子类都是一种实现,可以完全不相同,即便算法之间存在共性,也需要在每个子类重新实现,通过聚合的方式实现,可以动态的改变算法,比较灵活。

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 抽象模板
 */
public abstract class Game {
 /**
 * 具体方法
 */
 public void initialize(){
 System.out.println("game initialize .........");
 }
 /**
 * 抽象方法
 */
 abstract void startPlay();
 abstract void endPlay();
 /**
 * 钩子方法
 * @return 是否需要结束
 */
 boolean isNeedEnd(){
 return false;
 }
 /**
 * 模板方法
 * final修饰 不允许子类修改
 * 每一个游戏先初始化、开始游戏 是否需要结束游戏 根据钩子进行判断
 */
 public final void play(){
 //初始化游戏
 initialize();
 //开始游戏
 startPlay();
 if(isNeedEnd()){
 //结束游戏
 endPlay();
 }
 }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 具体模板
 * 足球游戏
 */
public class Football extends Game{
 @Override
 void endPlay() {
 System.out.println("Football Game Finished!");
 }
 @Override
 void startPlay() {
 System.out.println("Football Game Started. Enjoy the game!");
 }
 @Override
 boolean isNeedEnd() {
 return false;
 }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 模板测试类
 */
public class TemplateModeTest {
 public static void main(String[] args) {
 Game game = new Basketball();
 game.play();
 game = new Football();
 game.play();
 }
}

运行结果:

JDK和框架中的模板模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T> T execute(StatementCallback<T> action) throws DataAccessException {
 Assert.notNull(action, "Callback object must not be null");
 Connection con = DataSourceUtils.getConnection(getDataSource());
 Statement stmt = null;
 try {
 Connection conToUse = con;
 if (this.nativeJdbcExtractor != null &&
 this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
 conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
 }
 stmt = conToUse.createStatement();
 applyStatementSettings(stmt);
 Statement stmtToUse = stmt;
 if (this.nativeJdbcExtractor != null) {
 stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
 }
 T result = action.doInStatement(stmtToUse);
 handleWarnings(stmt);
 return result;
 }
 catch (SQLException ex) {
 // Release Connection early, to avoid potential connection pool deadlock
 // in the case when the exception translator hasn't been initialized yet.
 JdbcUtils.closeStatement(stmt);
 stmt = null;
 DataSourceUtils.releaseConnection(con, getDataSource());
 con = null;
 throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
 }
 finally {
 JdbcUtils.closeStatement(stmt);
 DataSourceUtils.releaseConnection(con, getDataSource());
 }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean isSkipResultsProcessing() {
 return this.skipResultsProcessing;
}

spring中的JdbcTemplate、RedisTemplate、RestTemplate都是典型的模板模式,都是继承Accessor类和实现Operations接口。

优缺点

优点:封装不变部分,扩展可变部分。 提取公共代码,便于维护。 行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

生活中的命令模式

PPT模板,从网上下载自己喜欢的PPT模板,在不改变大的整体框架的情况下,替换掉部分内容,比如文字内容、部分图片内容,可以很大程度提高产出率。

机器学习中的迁移学习,也是一个典型的模板模式,机器学习中提供了很多模板模型,VGG19、ResNet50、InceptionV3,如果我们自己训练这个模型需要花很长的时间,几周或者更长的时间,可以把别人训练好的模型作为模板,做一些细微的调整,去训练我们自己的样本数据,得到一个适合我们特有数据的模型,只需要训练比较短的时间,就能得到一个比较好的模型。

我的启发

模板模式就像站在巨人的肩膀上,在大方向上借鉴别人的经验,进行适当的调整,以满足我们自己定制化的需求。当我们不具备造轮子的能力的时候,合理选择适合的模板也是一种不错的选择。

设计模式系列文章历史

java设计模式之适配器模式,大丈夫能屈能伸

Head First 设计模式之命令模式,各司其职提高效率

Head First 设计模式之装饰器模式,因为参与,所以认同

Head First 设计模式之单例模式,每个人都是唯一

Head First 设计模式之观察者模式,你我都是发布者和订阅者

Head first 设计模式之策略模式,来源于生活,用之于生活

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java程序员思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-模板方法模式
模板方法(Template Method)模式的定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式. 其优点有:
六个核弹
2022/12/23
2870
设计模式-模板模式
模板模式主要由抽象模板(Abstract Template)角色和具体模板(Concrete Template)角色组成。
架构狂人
2023/10/09
1630
设计模式-模板模式
设计模式(十四):模板模式
设计模式(十四):模板模式
Java架构师必看
2021/04/13
2210
23种设计模式之模板模式
模板模式指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。
Java技术债务
2022/09/26
2350
23种设计模式之模板模式
模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
HLee
2021/04/16
4250
模板模式
二十八、模板模式 ( Template Pattern )
模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
botkenni
2022/09/23
1750
二十八、模板模式 ( Template Pattern )
Spring中使用的设计模式
  Spring框架是每个java程序猿入门级的框架也是最重要的框架,而Spring中也采用了很多的设计模式,这些也会成为我们面试过程中经常会问到的问题,所以本文就整理出Spring中具体使用的哪些设计模式。
用户4919348
2019/04/02
4840
Spring中使用的设计模式
模板方法设计模式(Template Pattern)
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
JavaEdge
2020/05/27
3120
Spring周边:Template Method 模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
WEBJ2EE
2019/10/14
4920
Spring周边:Template Method 模式
java设计模式之模板模式以及钩子方法使用
  模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台。当不可变和可变的方法在子类中混合在一起的时候,
小勇DW3
2018/08/30
1.1K0
设计模式-抽象类,只是想为你做更多
如果说面向对象中的接口是把所有的事情扔给你的话,那么抽象类显然是想要为你做一些事情,如果实在有一部分做不了再扔给你。 相信对于大部分业务开发的场景下都不太会需要自己去写抽象类。但在一些特殊场景我们还是不得不搞个抽象类。 还是从实际的使用场景来说起吧。 实际案例 案例一、封装email组件。 public abstract class AbstractEmail implements SendEmailable { ....... public AbstractEmail(boolean built
ImportSource
2018/04/03
6630
设计模式-抽象类,只是想为你做更多
设计模式03——Template Method模式
模板方法(Template Method)模式就是带有模板功能的模式 ,组成模板方法的方法被定义在父类中,这些方法是抽象方法,在模板方法中规定了这些方法的执行流程,这些抽象方法需要子类来具体实现。换句话说,模板方法就是定义好了模板,也就是一定的流程,至于各个抽象方法的具体实现,则有子类们自己决定,所以查看父类的代码是无法知晓这些方法最终会进行何种具体处理,唯一知道的就是父类是如何调用这些方法的。
itlemon
2020/04/03
8330
设计模式03——Template Method模式
字节跳动大厂面试题详解:抽象类可以被实例化吗
抽象类是一种包含抽象方法的类,它的存在主要用于被其他类继承。抽象方法是一种声明而不提供实现的方法,留给子类去实现。抽象类本身不能被实例化,因为它可能包含了未实现的方法,无法被完全实例化。
GeekLiHua
2025/01/21
980
Java - JdbcTemplate底层调用逻辑
以jdbcTemplate.queryForList方法为例,通过重点代码查看内部执行原理
夹胡碰
2021/01/13
5380
设计模式--模板方法模式的思考
模板方法同样也是一种很实用的方法,目的是提高代码复用,并且统一大体的算法流程,比如一个一台电脑主机,定义好放置CPU,硬盘,内存等空位后,就形成了一个骨架,那么这个就是模板,具体的CPU,内存,硬盘是什么牌子型号则不需要考虑,这些是具体到业务中的实现类所负责的事情.
屈定
2018/09/27
5790
设计模式--模板方法模式的思考
Java设计模式之模板模式
基本概念 模板方法模式,又叫模板模式。在一个抽象类中公开定义了执行它的方法的模板,它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。 简单说,模板模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。 这种类型的设计模式属于行为型模式。 案例 编写制作豆浆的程序,说明如下: 制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎。 通过添加不同的配料,可以制作出不同口味的豆浆。 选材、浸泡和放到豆浆机打碎这几个
shaoshaossm
2022/12/27
2420
Java设计模式之模板模式
设计模式——模板模式
设计模式——模板模式
Java架构师必看
2021/05/14
4020
设计模式——模板模式
设计模式实战-模板模式,代码复用神器
模板模式(Template Pattern)又被称作模板方法模式(Template Method Pattern),它是一种简单的、常见的且应用非常广泛的模式。
架构师修炼
2020/07/17
9040
CRUD很无聊?一起学设计模式吧!--模板模式​
模板方法(Template Method)模式的定义如下: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
JAVA日知录
2019/11/20
4780
CRUD很无聊?一起学设计模式吧!--模板模式​
图解Java设计模式之模板模式
1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的 4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。
海仔
2020/04/01
4240
图解Java设计模式之模板模式
相关推荐
设计模式-模板方法模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验