您的位置:首页 > 其它

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

2013-08-02 22:56 274 查看
            本来打算按照书上的讲的设计模式一个一个学下来,但是读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来说,这些过程都是一样的,只是提交到数据库的时候不同,这里就是采用的模板方法模式来进行代码优化的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: