文档章节

小菜学设计模式——模板方法模式

learn_more
 learn_more
发布于 2015/06/09 16:31
字数 1446
阅读 121
收藏 5
点赞 1
评论 0

背景

    很多时候我们总是循规蹈矩重复同一件事情,比如现在的我如果没有坚持继续学习,肯定就像一个行尸走肉一般重复的打着一样的逻辑代码,呵呵,每次完成代码之后估计还会得瑟一下,这个世界只有我能如此出色的完成这项工作,不说了,以前的我确实有点吹毛求疵、自以为是。不过,现在意识到程序员需要不断学习之后,我就把网名改为learn more, 意思是敦促自己学无止境。

    那么,对于这种样板式的重复,我们应该如何避免呢?那就是抽出重复的代码,自定义实现改变的方法!

1、使用意图

    代码复用,逻辑不发生改变!

2、生活实例

    每次进公司大门的时候,门会自动打开;每次下班离开公司大门的时候,门会自动关闭;这个打开又关闭的过程本来是每个人必须手动完成的,但是为了避免有些人不会开门,或者过于麻烦去开门,所以,自动门就这样产生了!这个小的过程中就蕴含了设计模式——模板方法模式

3、Java 例子(框架、JDK 、JEE)

    JDBC、LDAP查询或操作的时候,总有那么一些重复的代码,估计学过java的人都知道,

    首先,如果没有加载过驱动类的那么加载一个驱动;

    其次,Connection con = DriverManger.getConnection 获取一个对应数据源连接;

    然后,使用连接con来获取对应的预编译语句对象 PreparedStatement,不知道类名称写错了没有

    接着,自定义sql,对sql语句参数处理,占位符替换等,使之成为一条可以运行的语句

    继续,如果是数据库操作自然开启事务吗,否则没必要开启事务浪费资源

    最后,执行操作,关闭事务,关闭语句,关闭连接

    看到了没有,下次要执行另外一条的sql的时候还得按部就班,代码的坏味道告诉我们重复是非常容易出错的,那么如何避免这写重复呢?Spring对JDBC进行封装之后,很好的避免了重复了,使用Spring时,只要拿到事务、开启事务,在事务内部写我们的业务逻辑就好,其他内操作按照模板样式自动完成。

    自己也使用Lucene写过一个数据库表索引创建的方法,因为数据库记录比较多,首先想到的肯定是分页查询,否则一口气查询估计会内存溢出,既然是分页,那么每次分页过后的数据得马上处理,为了不影响性能,所以把整个查询放在一个数据连接里面,那么,就是数据连接和分页是一个模板,而具体对这些查询结果如何操作则是自定义扩展的地方,所以把操作方法写成一个抽象方法,供客户端实现。

4、模式类图

    父类角色:定义一个抽象类,首先声明完成某一特定任务的一些方法名称(其具体实现交给子类去完成),这些方法称为步骤。并且定义一个方法,这个方法的实现就是调用前面的那些声明过的方法,关键在于这些方法的顺序就已经在这里得到确定(子类不能更改),称之为模板方法。

   子类角色:实现了父类角色那些抽象方法(步骤),并且继承它的模板方法。因此无论如何实现步骤,它的模板是不会更改的。

   总结:

   模板方法实际上就是有步骤的完成某一件事情,而这些步骤已经在父类的方法中定义好了,把步骤中需要自定义的方法抽象出来交给子类去实现。

5、模式优点

    模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

    模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现他的优势。

    模板方法模式就是提供了一个很好的代码复用平台

    当不变的行为和可变的行为在方法的子类实现中混合一起时,不变的行为就会在子类中重复出现。通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的困扰。

    通过以上的定义,我们不一定非要用子类去实现父类,而是可以在父类中定义算法规则步骤的时候把父类的抽象方法改为调用一个抽象类的抽象方法,而这个方法具体实现则交给这个抽象类的子类去完成,这样的话,某些时候可以很好的把某些类的斧子关系分开。

6、与类似模式比较

    这个设计模式,用得非常多,也不容易产生误会,所以没什么可以去比较的


© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 90
博文 240
码字总数 210196
作品 0
深圳
程序员
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei ⋅ 05/26 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

前面我们聊了: 什么是设计模式?你知道多少? 你必须知道的六大设计原则 第一个设计模式,我是皇帝我独苗,单例模式 第二个设计模式,工厂方法模式 第三个设计模式,抽象工厂模式 这个真的很...

微wx笑 ⋅ 05/29 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

【设计模式】——命令模式

【情景展示】 在网络出现之前,我们的日常生活中,人与人的交际,一般使用语言沟通,然而社会在进步,随着城市化进程的加快,我们的生活发生了巨大的变化,如今的社会,人与人之间的交流方式...

u013043341 ⋅ 02/02 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_ ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 30分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 32分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 37分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 41分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 41分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 41分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 43分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 48分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 52分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 56分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部