文档章节

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

 宸明
发布于 09/20 12:37
字数 898
阅读 8
收藏 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最佳实践(1)

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

zuoer
2012/01/04
0
2
SpringBoot实战(四)之使用JDBC和Spring访问数据库

这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库。 H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个...

youcongtech
08/03
0
0
Spring JDBC最佳实践(3)

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

zuoer
2012/01/06
0
6

没有更多内容

加载失败,请刷新页面

加载更多

CMD命令行:查看Windows操作系统的安装时间

电脑越用越卡,计划以后每两个月重新安装一次系统。 那,怎么查看自己系统的安装日期? 问题抛出来了,其实很简单的。 cmd 中输入 systeminfo 命令,回车,等一会 …… 出来结果后,查找下面...

LivingInFHL
4分钟前
0
0
复习

10月19日任务 打印某行到某行之间的内容 sed转换大小写 sed在某一行最后添加一个数字 删除某行到最后一行 打印1到100行含某个字符串的行 一.打印某行到某行之间的内容 #sed -n '/\[abcfd\]/...

hhpuppy
5分钟前
0
0
精通Spring Boot——第十一篇:使用自定义配置

今天这篇文章给大家介绍自定义配置的两种方式 第一式: 使用@ConfigurationProperties,且看代码 package com.developlee.customconfig.config;import org.springframework.boot.context.p...

developlee的潇洒人生
11分钟前
0
0
python:pycharm启动出现异常:io.netty.channel.ChannelException.....

尝试用管理员权限启动终端, 输入: netsh winsock reset 重启电脑. 360的优化搞出来的幺蛾子........

Oh_really
20分钟前
0
0
设计模式学习与应用——策略模式

概念 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。 使用场景 1.在系统里面许多类,类之间区别仅在于方法行为,那么...

隔壁老余在这
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部