设计模式之模板方法模式(Template Method)
2013-08-02 22:56
274 查看
本来打算按照书上的讲的设计模式一个一个学下来,但是读spring源码的时候遇到模板方法模式,不懂,就提前先学一下。
模板方法模式就是定义一个算法执行的骨架,而具体的算法被延迟到子类中去实现,在spring中很多地方都使用到了模板方法模式,比如spring的JdbcTemplate,spring的HibernateTemplate中都是用了模板方法模式。
我们来看一个例子说明为什么要使用模板方法模式:
有一个打印报表类Report完成表头、正文、表尾的打印代码如下:
客户端我们直接调用Report的print方法即可,当某一时刻,我们又想改一下表头的格式,那么我们修改打印表头的那段代码就可以了,但是修改完后我们又觉得还是原来的好,我们还得改回来,这就坑爹了,这时我们就可以使用模板方法模式了,因为打印表头、表尾、正文是必须的,我们首先定义打印报表的骨架:
我们可以讲具体的打印表头、正文、表尾的方式抽取出来,留给子类来实现:
如果有新的需求,我们直接添加一个实现Report的类即可:
这样我们就可以在不改变原有代码的基础上实现报表格式的改变,客户端调用:
当我们在实现某功能时,该功能的实现步骤不变,而每个步骤的实现可变时,我们就可以使用模板模式了。比如在持久层框架处理的时候都要经过以下几个过程:
1、获取会话2、开始实务3、提交到数据库4、提交事务5、关闭会话
而对于CRUD来说,这些过程都是一样的,只是提交到数据库的时候不同,这里就是采用的模板方法模式来进行代码优化的。
模板方法模式就是定义一个算法执行的骨架,而具体的算法被延迟到子类中去实现,在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来说,这些过程都是一样的,只是提交到数据库的时候不同,这里就是采用的模板方法模式来进行代码优化的。
相关文章推荐
- Java设计模式透析之 —— 模板方法(Template Method)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 设计方式之 模板方法(Template Method)模式
- Java设计模式之--模板方法模式(Template Method)
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 模板方法模式(Template Method) - Java实现
- Java设计模式透析之 —— 模板方法(Template Method)
- 设计模式学习笔记(七)之模板方法模式(Template Method)
- C++设计模式编程中Template Method模板方法模式的运用
- 设计模式--模板方法模式Template method(类行为型)
- 设计模式心得: 模板方法模式(template method pattern)
- 设计模式学习笔记(三):模板方法模式【Template Method】(二) 问题解决
- 设计模式笔记11:模板方法设计模式(Template Method Pattern)
- 设计模式之---模板方法template method的使用
- 设计模式(14)-模板方法模式(Template Method)
- 设计模式----模板方法模式(Template Method)
- JUnit中的设计模式:模板方法模式 Template Method
- Java设计模式之模板方法模式(Template Method)
- 设计模式系列之Template Method(模板方法模式)
- 设计模式 - Template Method模式(模板方法模式)