文档章节

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

learn_more
 learn_more
发布于 2015/06/09 16:31
字数 1446
阅读 121
收藏 5

背景

    很多时候我们总是循规蹈矩重复同一件事情,比如现在的我如果没有坚持继续学习,肯定就像一个行尸走肉一般重复的打着一样的逻辑代码,呵呵,每次完成代码之后估计还会得瑟一下,这个世界只有我能如此出色的完成这项工作,不说了,以前的我确实有点吹毛求疵、自以为是。不过,现在意识到程序员需要不断学习之后,我就把网名改为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
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
Java 设计模式(14) —— 复合模式

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

磊_lei
05/26
0
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java基础知识,小栗子

来操作一下数组.....注意带参数的变长数组的使用. package com.avatus;import java.util.Random;import java.util.Scanner;public class Main { public static void main(St...

Oh_really
10分钟前
0
0
SSO单点登录PHP简单版

  前面做了一个新项目,需要用户资源可以需要共享。由于之前没有做过这样的东西,回家之后,立马网站百度“单点登录”。帖子很多,甄别之后,这里列几篇认为比较有营养。   http://blog...

slagga
48分钟前
2
0
Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1 概述 泛型在j...

hensemlee
52分钟前
2
0
Annotation注解详细介绍

目录介绍 1.Annotation库的简单介绍 2.@Nullable和@NonNull 3.资源类型注释 4.类型定义注释 5.线程注释 6.RGB颜色纸注释 7.值范围注释 8.权限注释 9.重写函数注释 10.返回值注释 11.@Keep注释...

潇湘剑雨
54分钟前
2
0
一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的有西刺代理,快代理等,这里我们拿西刺代理作为例子。 这里就是一个个免费的IP地址以及各自...

NateHuang
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部