本来打算按照书上的讲的设计模式一个一个学下来,但是读spring源码的时候遇到模板方法模式,不懂,就提前先学一下。
模板方法模式就是定义一个算法执行的骨架,而具体的算法被延迟到子类中去实现,在spring中很多地方都使用到了模板方法模式,比如spring的JdbcTemplate,spring的HibernateTemplate中都是用了模板方法模式。
我们来看一个例子说明为什么要使用模板方法模式:
有一个打印报表类Report完成表头、正文、表尾的打印代码如下:
package com.dxy.design.pattern.template;
public class Report {
public void print() {
//打印表头
//打印正文
//打印表尾
}
}
客户端我们直接调用Report的print方法即可,当某一时刻,我们又想改一下表头的格式,那么我们修改打印表头的那段代码就可以了,但是修改完后我们又觉得还是原来的好,我们还得改回来,这就坑爹了,这时我们就可以使用模板方法模式了,因为打印表头、表尾、正文是必须的,我们首先定义打印报表的骨架:
package com.dxy.design.pattern.template;
public abstract class Report {
public void print() {
printHead();
printBody();
printTail();
}
public abstract void printHead();
public abstract void printBody();
public abstract void printTail();
}
我们可以讲具体的打印表头、正文、表尾的方式抽取出来,留给子类来实现:
package com.dxy.design.pattern.template;
public class ReportImpl extends Report {
@Override
public void printHead() {
System.out.println("第一种方式实现打印表头");
}
@Override
public void printBody() {
System.out.println("第一种方式实现打印正文");
}
@Override
public void printTail() {
System.out.println("第一种方式实现打印表尾");
}
}
如果有新的需求,我们直接添加一个实现Report的类即可:
package com.dxy.design.pattern.template;
public class ReportImpl1 extends Report {
@Override
public void printHead() {
System.out.println("第二种方式实现打印表头");
}
@Override
public void printBody() {
System.out.println("第二种方式实现打印正文");
}
@Override
public void printTail() {
System.out.println("第二种方式实现打印表尾");
}
}
这样我们就可以在不改变原有代码的基础上实现报表格式的改变,客户端调用:
package com.dxy.design.pattern.template;
public class Client {
public static void main(String[] args) {
Report report = new ReportImpl();
report.print();
}
}
当我们在实现某功能时,该功能的实现步骤不变,而每个步骤的实现可变时,我们就可以使用模板模式了。比如在持久层框架处理的时候都要经过以下几个过程:
1、获取会话2、开始实务3、提交到数据库4、提交事务5、关闭会话
而对于CRUD来说,这些过程都是一样的,只是提交到数据库的时候不同,这里就是采用的模板方法模式来进行代码优化的。