您的位置:首页 > 其它

设计模式——模板方法模式

2017-12-20 00:00 218 查看

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;
}
}

测试代码

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

输出结果如下



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

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

加载驱动

建立连接

获取Statement

拼接参数(针对PreparedStatement)

执行

返回结果

销毁连接

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

@Override
public <T> T query(final String sql, final ResultSetExtractor<T> 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<T>, 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源码

五、模板方法模式优缺点

一、优点:

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

二、缺点:

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

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

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

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

间的关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: