浅析Java模板方法的一种使用方式

2023-05-16 0 2,601

为什么我会想到使用模板方法呢?

日常开发中,我们经常需要使用编程式事务来解决一些实在的业务问题。以Hibernate框架为例(其实对于ORM框架来说,都大同小异。我们公司使用的是Hiberante,所以这里就以Hibernate为例了),我们实现一个编程式事务如下:

SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean(\"sessionFactory\");
Session session = sessionFactory.openSession();
try {
    session.beginTransaction();
    String sql = \"update table set A = :a where id = :id\";
    session.createNativeQuery(sql)
            .setParameter(\"a\", \"a\")
            .setParameter(\"id\", id)
            .executeUpdate();
    session.getTransaction().commit();
} catch (Exception e) {
    session.getTransaction().rollback();
} finally {
    session.close();
}

我们看上述的代码是不是有一种很乱的感觉,还要自己去写try{}catch{}finally{}。而且当我们代码中有很多地方都应用了编程式事务的话,那么我们的代码会显得有些臃肿。尤其对于我这种强迫症患者来说,哈哈!!

既然如此,我们肯定要想一种方式去优化一下,至少让它看起来更优美一些。我这里选择使用模板方法来改造一下。

什么是模板方法设计模式?

模板方法说白了就是将一段代码模板化,将通用的代码段抽取出来,并提供一些自定义的接口去定制的特定位置的某些业务功能。

根据我的理解,模板方法的核心思想就是 重写 。我们在模板中的指定位置提供一个外部可编辑的接口,让调用者可以根据需求去随意重写这个接口来达到他的目的。

其实在Spring中也广泛使用的模板方法,当我们学习Spring源码的时候会发现,实际上Bean的生命周期中就使用了模板方法。我们可以根据自己的需求在Bean生命周期的各个阶段去做一些事情。

代码优化

首先我们先维护一个抽象的模板类,这个类里包含了三个公开的方法,用来提供为调用者去定制使用。

public abstract class TransactionManagerTemplate {

    /**
     * 处理事务中的实际要处理的业务代码
     */
    public void handle() {}

    /**
     * 异常处理
     */
    public void exceptionHandle() {}

    /**
     * finally处理
     */
    public void finallyHandle() {}

}

然后我们创建一个事务管理器,封装一个runTransaction方法,里面就包含了上面那边不忍直视的代码。然后我们将Session和抽象的模板类作为参数传入

并且将抽象的模板类中的三个公开方法填入到try{}catch{}finally{}中的各个位置。

@Component
public class TransactionManager {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 默认SessionFactory
     */
    public static final String DEFAULT_SESSION_FACTORY = \"sessionFactory\";


    /**
     * 执行事务
     * @param session
     * @param transactionManagerTemplate
     *
     * 使用案例:
     * Session session = transactionManager.getSession();
     * transactionManager.runTransaction(session, new TransactionManagerTemplate() {
     *     // 实际要重写的接口
     * });
     */
    public void runTransaction(Session session, TransactionManagerTemplate transactionManagerTemplate) {
        try {
            session.beginTransaction();
            transactionManagerTemplate.handle();
            session.getTransaction().commit();
        } catch (Exception e) {
            transactionManagerTemplate.exceptionHandle();
            session.getTransaction().rollback();
        } finally {
            transactionManagerTemplate.finallyHandle();
            session.close();
        }
    }

    /**
     * 获取默认SessionFactory
     * @return
     */
    public SessionFactory getSessionFactory() {
        return getSessionFactory(DEFAULT_SESSION_FACTORY);
    }

    /**
     * 获取指定SessionFactory
     * @param beanName      指定SessionFactory的BeanName
     * @return
     */
    public SessionFactory getSessionFactory(String beanName) {
        SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean(beanName);
        if(sessionFactory == null) {
            throw new BAPException(\"不存在BeanName为【{}】的SessionFactory\", beanName);
        }
        return sessionFactory;
    }

    /**
     * 获取默认Session
     * @return
     */
    public Session getSession() {
        return getSessionFactory(DEFAULT_SESSION_FACTORY).openSession();
    }

    /**
     * 获取指定SessionFactory下的Session
     * @param sessionFactoryBeanName      指定SessionFactory的BeanName
     * @return
     */
    public Session getSession(String sessionFactoryBeanName) {
        return getSessionFactory(sessionFactoryBeanName).openSession();
    }

}

我们在业务代码中想要再次使用编程式事务时,就可以通过如下方式调用:

Session session = transactionManager.getSession();
transactionManager.runTransaction(session, new TransactionManagerTemplate() {
    @Override
    public void handle() {
        // try中要添加的业务逻辑
    }

    @Override
    public void exceptionHandle() {
        // catch中要添加的业务逻辑
    }

    @Override
    public void finallyHandle() {
        // finally中要添加的业务逻辑
    }
});

看,这是不是更美观了一些呀!

以上就是浅析Java模板方法的一种使用方式的详细内容,更多关于Java模板方法的资料请关注其它相关文章!

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 浅析Java模板方法的一种使用方式 https://www.20zxx.cn/705463/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务