我们在看spring中有部分说到持久层,其中有个类JdbcTemplate,它是利用Template模式。
Template模式就是说:在父类中定义一个操作算法或操作顺序,而将一些步骤的具体实现延迟到子类中。请看列子:
// TemplateTest.java
- package com.designpattern.template;
- /**
- * 父类
- */
- abstract class SuperTemplate {
- public abstract Object doInTransaction();
- public void execute() {
- try {
- System.out.println("事务开始。。。");
- System.out.println("开始执行业务逻辑代码。。。");
- doInTransaction();
- System.out.println("业务逻辑处理完成,提交事务");
- } catch (Exception e) {
- System.out.println("出现错误,回滚");
- }
- }
- }
- /**
- * 子类
- */
- class SubTemplate extends SuperTemplate {
- public Object doInTransaction() {
- System.out.println("正在执行业务逻辑代码。。。");
- // 事务出错代码
- // int i = 1/0;
- return null;
- }
- }
- public class TemplateTest {
- public static void main(String[] args) {
- SubTemplate s = new SubTemplate();
- s.execute();
- }
- }
首先在父类SuperTemplate中定义两个方法:doInTransaction()和execute(),execute()方法用来执行事务,doInTransaction()是事务的具体操作,但是doInTransaction()是个抽象方法,并没有具体的行为,它把行为交给了它的子类SuperTemplate ,子类中重写这个方法,然后在测试类中调用SubTemplate.execute()方法就行了。
出此之外,还有一种回调形式是利用接口回调函数,例子:
// TemplateTest2.java
- package com.designpattern.template;
- /**
- * 回调接口
- */
- interface TestTemplateCallBack {
- Object doSomething();
- }
- class Template2 {
- /**
- * 执行业务逻辑的方法,参数类型为接口对象
- *
- * @param callBack:TestTemplateCallBack接口对象
- */
- public void execute(TestTemplateCallBack callBack) {
- try {
- System.out.println("事务开始。。。");
- System.out.println("开始执行业务逻辑。。。");
- callBack.doSomething();
- System.out.println("业务逻辑执行成功,提交事务");
- } catch (Exception e) {
- System.out.println("出现错误,回滚");
- e.printStackTrace();
- }
- }
- }
- public class TemplateTest2 {
- public void insert(final String msg) {
- Template2 t = new Template2();
- // 匿名内部类重写方法
- t.execute(new TestTemplateCallBack() {
- public Object doSomething() {
- // 事务出错代码
- // int i = 1 / 0;
- System.out.println("插入数据:" + msg);
- return null;
- }
- });
- }
- public static void main(String[] args) {
- TemplateTest2 t = new TemplateTest2();
- t.insert("Hello");
- }
- }
在这里申明一个接口,里面有个方法doSomething()。Template2 这个类中的execute()方法用来执行事务,其中有个参数:execute(TestTemplateCallBack callBack),参数类型为之前定义的接口对象,然后就可以利用这个对象来调用doSomething()方法。但是doSomething()方法具体的操作内容在哪呢?它在TemplateTest2的insert()方法里面,这里在TemplateTest2类中定义一个insert()方法,接着申明一个Template2对象t,当执行t.execute()方法的时候,这时我们写个匿名类来当传入参数,这匿名类就是之前的接口,在匿名类中重写doSomething()方法就可以实现具体操作了。