前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Selenium自动化测试-4.By定位及如何确定元素唯一
(1)有时候我们不知道用哪种方法来定位元素,By定位可以根据实际场景设定定位策略。
可可的测试小栈
2019/10/17
1K0
《手把手教你》系列基础篇之3-python+ selenium自动化测试-驱动浏览器和元素定位大法
上一篇中,只是简单地一带而过的说了一些驱动浏览器,这一篇继续说说驱动浏览器,然后再说一说元素定位的方法。
北京-宏哥
2021/07/20
1.1K0
Selenium自动化测试-3.元素定位(3)
css定位是通过css选择器进行定位,我们需要了解css选择器的一些知识才能进行css定位,选择器基本语法如下:
可可的测试小栈
2019/10/17
3800
Selenium自动化测试-3.元素定位(3)
在上一篇:Selenium自动化测试-元素定位(2),我们介绍了xpath定位,xpath一般都能满足我们的定位需求。今天我们来介绍另一种——css定位神器。css相对xpath来说,语法更简洁、定位速度更快,xpath能定位到的,css一般也能定位到,可以说是神通广大的一员虎将。
王大力测试进阶之路
2020/03/11
4140
Selenium自动化测试-3.元素定位(3)
Selenium自动化测试-3.元素定位(2)
有时候我们发现网站并没有id、name等属性。那么,我们可以用更高级的定位方法——xpath来定位元素。
可可的测试小栈
2019/10/17
8740
python-selenum3 第五天定
使用tag来定位 tag定位的是标签,不常用 例如:百度的输入框标签是input 最终会报错,因为百度首页input标签太多了
py3study
2020/01/10
3970
python-selenum3 第五天定
​Java自动化测试 (元素定位 23)
使用脚本断点调试定位是否正确是一个方法,当时在我的实际工作中,元素定位代码的封装较深,所以修改查询元素的内容较麻烦,所以直接使用Xpath Helper可以方便的进行开发前的测试。不管是爬虫爬去页面内容还是自动化测试都很实用。
zx钟
2020/09/04
1.1K0
​Java自动化测试 (元素定位 23)
python---定位元素
(1)id定位 :id属性在html文档中是唯一的 find_element_by_id()方法通过id属性定位元素 (2)name定位 find_element_by_name()方法 (3)class定位 find_element_by_class_name()方法 (4)tag定位:tag往往用来定义一类功能,通过tag识别某个元素的概率很低 find_element_by_tag_name()方法 (5)link定位:用来定位文本链接。
py3study
2020/01/13
8420
web自动化捕捉元素基本方法
前言:前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架。我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的API。
测试小兵
2019/11/20
1.9K0
web自动化捕捉元素基本方法
🔥《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)
  俗话说:磨刀不误砍柴工,因此在我们要开始写自动化脚本之前,我们先来学习和了解几个基本概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本。
北京-宏哥
2022/02/11
1.2K0
🔥《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)
Selenium之页面元素定位
HTML页面规定了id属性在HTML文档中必须是唯一的(页面id不唯一时,在编辑器中会标红显示,但是页面依然能正常加载)。id定位方法就是通过元素的id属性来查找元素,比如通过id定位百度输入框:
小博测试成长之路
2021/03/08
3.5K0
Selenium之页面元素定位
自动化-Selenium 3-元素定位(Python版)
2.XPath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,那还是选择XPath或cssSelector。
wangmcn
2022/07/22
7.7K0
自动化-Selenium 3-元素定位(Python版)
python+selenium实现Web自动化
最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新!
conanma
2021/09/07
3.6K0
全网最全关于selenium webdriver 8大元素定位详解
元素的定位应该是自动化测试的核心,想要操作一个元素,首先应该识别这个元素。Webdriver提供了一系列的元素定位方法。
全栈程序员站长
2022/06/29
1.9K0
全网最全关于selenium webdriver 8大元素定位详解
python-selenum3 第四天定
如果把写用例当做是手工测试,那么UI级自动化就是将手工测试变成计算器自动执行的测试
py3study
2020/01/03
4740
python-selenum3 第四天定
Selenium元素定位
find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector() 在这里将对各种元素定位方式统一使用百度首页进行示例,详细操作步骤有以下内容: 1.打开浏览器,进入百度首页(www.baidu.com); 2.百度页面输入关键字 www.testclass.cn 进行搜索; 3.关闭浏览器; 首先,通过前端工具(火狐浏览器的Firebug)或者直接按F12进入开发者模式查看具体前端代码:
Altumn
2019/10/21
1.2K0
Selenium元素定位
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.4K0
Python Selenium库的使用「建议收藏」
java获取百度网页内容
RestTemplate是Spring提供的用于访问RESTful服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。RestTemplate默认依赖JDK提供http连接的能力 (HttpURLConnection),也可以通过替换为例如 Apache HttpComponents、Netty或OkHttp等其它HTTP 客户 端,OkHttp的性能优越,本博客使用OkHttp,官网, github。
许喜朝
2021/01/27
1.3K0
java获取百度网页内容
selenium实现浏览器自动化
利用自动化在百度搜索需要的信息就需要学习一下基本的操控元素的方法,根据HTML的Id获取元素,获取百度的input输入框id
是小张啊喂
2022/08/18
4450
Selenium+Python系列(二) - 元素定位那些事
这部分内容可以说是重中之重了,也是大部分写web自动化的同学,必会入门技能之一了。
软件测试君
2022/12/05
8370
Selenium+Python系列(二) - 元素定位那些事
推荐阅读
相关推荐
Selenium自动化测试-4.By定位及如何确定元素唯一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验