java设计模式-模板方法模式

原创 2016年08月31日 12:20:38

模板方法模式概念

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


模板方法模式类图

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


模板方法模式实现

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

/**
 *@author xialonglei
 *@date 2016/8/31 
 */
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();
}

输出结果如下
这里写图片描述


模板方法在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都是额外定义的接口)

@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源码


模板方法模式优缺点

优点:

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

缺点:

  • 按照我们的设计习惯,抽象类负责声明最抽象、最一般的事情属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感
  • 因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系

                                                              -_-没有天才,只有勤奋的天才!                                  
    
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。
  • jason0539
  • jason0539
  • 2015年04月15日 08:37
  • 27104

java 模版方法模式

原文出处:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不...
  • chenhuade85
  • chenhuade85
  • 2012年11月02日 15:40
  • 5372

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?...
  • eson_15
  • eson_15
  • 2016年05月06日 08:57
  • 3855

java设计模式之模板设计模式

1. 模板设计模式是定义 模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现2. 模板设计模式优点 使用模版方法模式,在定义算法骨架的同时,可...
  • mmd_Jason
  • mmd_Jason
  • 2016年07月02日 19:37
  • 359

java设计模式--模板模式

16.1 场景问题16.1.1 登录控制 几乎所有的应用系统,都需要系统登录控制的功能,有些系统甚至有多个登录控制的功能,比如:普通用户可以登录前台,进行相应的业务操作;而工作人员可以登录后台...
  • lucas421634258
  • lucas421634258
  • 2015年11月15日 18:50
  • 583

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。
  • jason0539
  • jason0539
  • 2015年04月15日 08:37
  • 27104

设计模式系列之四_策略模式 和 模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。 策略模式让算法独立于使用它的客户而独立变化。   策略模式属于对象的行为模式...
  • orclight
  • orclight
  • 2013年03月12日 16:28
  • 3591

设计模式之禅——模板方法模式&钩子方法

**模**板方法模式的定义:定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤。例子:做一个简单的悍马车的模型见UML图 一个抽象悍马...
  • TyroneRenekton
  • TyroneRenekton
  • 2016年08月21日 12:15
  • 4429

JAVA设计模式之 模板方法模式【Template Method Pattern】

一、概述 二、适用chuangk
  • l416112167
  • l416112167
  • 2014年11月11日 01:09
  • 2818

行为型模式之模板方法模式(java版)

1.引入 模板方法模式就是当我们需要把某些细节层次,但器个别步骤的更详细的实现却是不同的时候,就需要用模板方法模式。实际上就是把一些更详细的信息在子类中去实现,这里更详细的信息就是可变的信息,因为每个...
  • ya_1249463314
  • ya_1249463314
  • 2016年08月26日 10:43
  • 331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java设计模式-模板方法模式
举报原因:
原因补充:

(最多只允许输入30个字)