博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——模板方法模式
阅读量:7210 次
发布时间:2019-06-29

本文共 3005 字,大约阅读时间需要 10 分钟。

hot3.png

1、模板方法模式概念

  模板方法模式属于行为型模式,它定义一个操作中的算法的骨架,而将一些步骤推迟到子类当中实现。父类抽取并实现的是公共方法,对于可变方法,父类做的只是定义了可变行为的接口,具体实现留给子类去完成,实现对代码的重复利用。

2、模板方法模式类图

输入图片说明

这里的templateMethod方法就是公共方法,是所有子类所拥有的公共行为;abstractMethod方法就是可变的行为,是每个子类独特行为,这种行为只能由它们来实现。

3、模板方法模式实现

拿<<大话设计模式>>上的例子来说,学生是共用一套试卷,只是学生各自的答案是不同的;因此,试题题目是模板方法是不变的,而试题答案对于每个学生是可变的

/** * */public abstract class AbstractTemplate {    private String name;    public AbstractTemplate(String name){        this.name = name;    }    public void question(){        System.out.print(name + ":1 + 1 = ");        System.out.print(answer());        System.out.println();    }    public abstract int answer();}public class StudentATemplate extends AbstractTemplate{    @Override    public int answer() {        return 2;    }    public StudentATemplate(String name) {        super(name);    }}public class StudentBTemplate extends AbstractTemplate{    public StudentBTemplate(String name) {        super(name);    }    @Override    public int answer() {        return 3;    }}

测试代码

@Testpublic void templatePatternTest(){    AbstractTemplate aTempate = new StudentATemplate("小红");    AbstractTemplate bTempate = new StudentBTemplate("小明");    aTempate.question();    bTempate.question();}

输出结果如下

输入图片说明

4、模板方法在spring中的运用

spring中的JdbcTemplate类就运用了模板方法,java在执行数据库操作时的步骤无非如下几步:

  1. 加载驱动
  2. 建立连接
  3. 获取Statement
  4. 拼接参数(针对PreparedStatement)
  5. 执行
  6. 返回结果
  7. 销毁连接

在这里只是简单,介绍一下,因此针对PreparedStatement,最大的可变之处就是5,6这个部分,因此JdbcTemplate将1,2,3,4,7制作成模板(主要在execute方法中),而对于5,6它通过匿名内部类的形式来实现(也就是说对于update、query等等操作,都对5,6通过匿名内部类有不同的实现,匿名内部类实现的都是callback接口,*callback都是额外定义的接口)

@Overridepublic 
T query(final String sql, final ResultSetExtractor
rse) throws DataAccessException { Assert.notNull(sql, "SQL must not be null"); Assert.notNull(rse, "ResultSetExtractor must not be null"); if (logger.isDebugEnabled()) { logger.debug("Executing SQL query [" + sql + "]"); } //匿名内部类 class QueryStatementCallback implements StatementCallback
, SqlProvider { @Override public T doInStatement(Statement stmt) throws SQLException { ResultSet rs = null; try { rs = stmt.executeQuery(sql); ResultSet rsToUse = rs; if (nativeJdbcExtractor != null) { rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); } return rse.extractData(rsToUse); } finally { JdbcUtils.closeResultSet(rs); } } @Override public String getSql() { return sql; } } //真正执行的方法 return execute(new QueryStatementCallback());}

这里只贴出了其中一个query方法,其他的”套路”都跟它差不多,如果感兴趣的话自己可以深究一下JdbcTemplate源码

五、模板方法模式优缺点

一、优点:

抽出不变行为,对代码的重复利用;要扩展的话,只需添加子类

二、缺点:

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事情属性和方法,实现类完成具体的事物属性和

方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结果影响了父类的

结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不

适感,因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之

间的关系

转载于:https://my.oschina.net/u/3136594/blog/1592797

你可能感兴趣的文章
LESS CSS 框架简介与使用
查看>>
2014.09线上课堂报名帖:敏捷个人手机应用使用
查看>>
C# 重启exe
查看>>
Web 服务器 之 简易WWW服务器的架设
查看>>
一种电子病历系统软件框架思想
查看>>
轻松破解NewzCrawler时间限制
查看>>
gDebugger 3.1.1 原版+破解
查看>>
C++ 对象的内存布局(上)
查看>>
在Outlook中用VBA导出HTML格式邮件
查看>>
搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
查看>>
PHP——通过下拉列表选择时间(转)
查看>>
由1433端口入侵,浅谈sqlserver安全 (转)
查看>>
2个YUV视频拼接技术
查看>>
spring data实现自定义的repository实现类,实现跟jpa联通
查看>>
“惊群”,看看nginx是怎么解决它的
查看>>
Theano3.3-练习之逻辑回归
查看>>
利用RGB-D数据进行人体检测 带dataset
查看>>
live555的编译及使用
查看>>
C++builder XE 安装控件 及输出路径
查看>>
优点和阵列的缺点,并且一个链表
查看>>