文档章节

Spring JdbcTemplate模板模式与回调结合分析

 宸明
发布于 09/20 12:37
字数 898
阅读 9
收藏 3

在看Spring的JdbcTemplate的时候,看到其将模板模式和回调模式结合使用的实现,可以精妙的解决很多的问题。详见Spring中涉及的设计模式总结中的关于模板模式和回调模式结合的具分析,本文利用设计思想实现了一个简单的模板+回调的demo

模板模式

所谓模板板式,就是在父类中定义算法的主要流程,而把一些个性化的步骤延迟到子类中去实现,父类始终控制着整个流程的主动权,子类只是辅助父类实现某些可定制的步骤。
模板方法设计模式适用性:
1、一次性实现一个算法的不变部分,并将可变的算法留给子类来实现。
2、各子类中公共的行为应该被提取出来并集中一个公共父类中以避免代码重复。 3、可以控制子类扩展。

模板模式的继承方式实现

模板模式的相关实现详见参考文献

模板模式结合回调方式实现

上述模板模式存在一个问题,每个子类都要都要继承一下上面的父类中的抽象方法,这时,通过CallBack(回调)可以解决这种问题。 所谓回调,就是方法参数中传递一个接口,父类在调用此方法时,必须调用方法中传递的接口的实现类。

Demo实现

公共操作类

public class AccService {

    public Object executeAcc(Object req) {
        // 通用流程

        Object result = null;
        doExecute1();
        // 不同的实现部分
        BaseAccReq accReq = doGenAccReq(req);
        System.out.println(accReq);
        // 不同的实现部分
        result = doInvoke(accReq);
        return result;
    }

    // 默认实现
    BaseAccReq doGenAccReq(Object req) {
        return null;
    }

    // 默认实现
    Object doInvoke(BaseAccReq req) {
        return null;
    }

    public BaseAccReq execute(AccReqGenCallBack action, Object req) {
        // before
        BaseAccReq accReq = action.doGenAccReq(req);
        // after
        return accReq;
    }

    public Object execute(AccInvokeCallBack action, BaseAccReq req) {
        // before
        Object result = action.doInvoke(req);
        // after
        return result;
    }

    private void doExecute1() {
        // doSomething
    }
}

具体操作类1

public class GeneralAccService extends AccService {

    @Override
    BaseAccReq doGenAccReq(Object req) {
        final Object test = new Object();
        return execute(new AccReqGenCallBack() {

            @Override
            public BaseAccReq doGenAccReq(Object req) {
                GeneralAccReq generalAccReq = new GeneralAccReq();
                generalAccReq.setOrdNo("1234");
                generalAccReq.setPrdNo("01");
                System.out.println(test);
                // doSomething
                return generalAccReq;
            }
        }, req);
    }

    @Override
    Object doInvoke(BaseAccReq req) {
        return execute(new AccInvokeCallBack() {

            @Override
            public Object doInvoke(BaseAccReq req) {
                GeneralAccReq generalAccReq = (GeneralAccReq) req;
                System.out.println(generalAccReq);
                // call Third Service
                return new Object();
            }
        }, req);
    }
}

具体操作类2

public class AdaptAccService extends AccService {

    @Override
    BaseAccReq doGenAccReq(Object req) {
        final Object test = new Object();
        return execute(new AccReqGenCallBack() {

            @Override
            public BaseAccReq doGenAccReq(Object req) {
                AdaptAccReq adaptAccReq = new AdaptAccReq();
                adaptAccReq.setOrdNo("1234");
                adaptAccReq.setChkNo("02");
                System.out.println(test);
                // doSomething
                return adaptAccReq;
            }
        }, req);
    }

    @Override
    Object doInvoke(BaseAccReq req) {
        return execute(new AccInvokeCallBack() {
            @Override
            public Object doInvoke(BaseAccReq req) {
               AdaptAccReq adaptAccReq = (AdaptAccReq)req;
                System.out.println(adaptAccReq);
               //call Third Service
               return new Object();
            }
        },req);
    }
}

回调接口定义1

public interface AccReqGenCallBack {
    BaseAccReq doGenAccReq(Object req);
}

回调接口定义2

public interface AccInvokeCallBack {
    Object doInvoke(BaseAccReq req);
}

请求、返回对象定义

public class BaseAccReq {

    private String ordNo;

    public String getOrdNo() {
        return ordNo;
    }

    public void setOrdNo(String ordNo) {
        this.ordNo = ordNo;
    }

}
public class GeneralAccReq extends BaseAccReq {

    private String prdNo;

    public String getPrdNo() {
        return prdNo;
    }

    public void setPrdNo(String prdNo) {
        this.prdNo = prdNo;
    }
}
public class AdaptAccReq extends BaseAccReq {
    private String chkNo;

    public String getChkNo() {
        return chkNo;
    }

    public void setChkNo(String chkNo) {
        this.chkNo = chkNo;
    }

}

测试类

public class TestAcc {
    public static void main(String[] args) {
        GeneralAccService generalAccService = new GeneralAccService();
        Object req   = new Object();
        Object result = generalAccService.executeAcc(req);
        System.out.println(result);
        AdaptAccService adaptAccService = new AdaptAccService();
        Object result2 = adaptAccService.executeAcc(req);
        System.out.println(result2);
    }
}

参考文献 Spring中的模板模式和回调模式

回调机制和模板方法

Spring中涉及的设计模式总结

© 著作权归作者所有

共有 人打赏支持
粉丝 16
博文 49
码字总数 72942
作品 0
程序员
私信 提问
Spring中涉及的设计模式总结

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是...

caoxiaohong1005
04/22
0
0
对JDBC的支持 之 7.2 JDBC模板类

JDBC模板类 概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。 JdbcTemplate类通过模...

heroShane
2014/02/27
0
0
Spring 对JDBC操作的支持

在用JDBC进行数据库的操作的时候会在每个DAO中写有很多重复和类似的代码(建立连接,关闭连接等等),Spring的JDBC框架对这些重复的操作做了提取,形成了模板,使用Spring的JDBC框架的开发者通过提...

晨曦之光
2012/04/25
1K
0
Spring JDBC最佳实践(1)

Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。 基于Tem...

zuoer
2012/01/04
0
2
Spring JDBC最佳实践(3)

spring jdbc包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate,我们可以先从JdbcTemplate入手,领略一下这个类的便利和优雅。 1、使用JdbcTemplate进行数...

zuoer
2012/01/06
0
6

没有更多内容

加载失败,请刷新页面

加载更多

Spring boot中如何获取profiles环境

  实现ApplicationContextAware @Componentpublic class QiNiuPropertiesConfig implements ApplicationContextAware { /// 获取当前环境public String getActiveProfile() { ret......

writeademo
3分钟前
0
0
机器学习中的End-to-End到底是怎么回事?

简单讲就是,Input--->系统(这里指神经网络)--->Output(直接给出输入,NN神经网络就给出结果,一气喝成!!!) 借用一段对话:(http://dy.163.com/v2/article/detail/C3J6F2NJ0511AQHO....

火力全開
3分钟前
0
0
maven多个模块只编译并且只打包指定的模块

在多module的maven项目中,如果每次打包整个工程显得有些冗余和笨重。 命令:mvn clean package install -pl 模块的名称 -am

lifes77
5分钟前
0
0
eosjs中文手册【2.0】

访问地址:eosjs 2.0 中文手册 - 汇智网

汇智网教程
9分钟前
0
0
vue-cli 3 分环境打包

在vue-cli3的项目中, npm run serve时会把process.env.NODE_ENV设置为‘development’; npm run build 时会把process.env.NODE_ENV设置为‘production’; 此时只要根据process.env.NODE_...

灰白发
17分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部