淺析Java模板方法的一種使用方式
為什么我會(huì)想到使用模板方法呢?
在日常開發(fā)中,我們經(jīng)常需要使用編程式事務(wù)來解決一些實(shí)在的業(yè)務(wù)問題。以Hibernate框架為例(其實(shí)對(duì)于ORM框架來說,都大同小異。我們公司使用的是Hiberante,所以這里就以Hibernate為例了),我們實(shí)現(xiàn)一個(gè)編程式事務(wù)如下:
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{}。而且當(dāng)我們代碼中有很多地方都應(yīng)用了編程式事務(wù)的話,那么我們的代碼會(huì)顯得有些臃腫。尤其對(duì)于我這種強(qiáng)迫癥患者來說,哈哈?。?/p>
既然如此,我們肯定要想一種方式去優(yōu)化一下,至少讓它看起來更優(yōu)美一些。我這里選擇使用模板方法來改造一下。
什么是模板方法設(shè)計(jì)模式?
模板方法說白了就是將一段代碼模板化,將通用的代碼段抽取出來,并提供一些自定義的接口去定制的特定位置的某些業(yè)務(wù)功能。
根據(jù)我的理解,模板方法的核心思想就是 重寫 。我們?cè)谀0逯械闹付ㄎ恢锰峁┮粋€(gè)外部可編輯的接口,讓調(diào)用者可以根據(jù)需求去隨意重寫這個(gè)接口來達(dá)到他的目的。
其實(shí)在Spring中也廣泛使用的模板方法,當(dāng)我們學(xué)習(xí)Spring源碼的時(shí)候會(huì)發(fā)現(xiàn),實(shí)際上Bean的生命周期中就使用了模板方法。我們可以根據(jù)自己的需求在Bean生命周期的各個(gè)階段去做一些事情。
代碼優(yōu)化
首先我們先維護(hù)一個(gè)抽象的模板類,這個(gè)類里包含了三個(gè)公開的方法,用來提供為調(diào)用者去定制使用。
public abstract class TransactionManagerTemplate {
/**
* 處理事務(wù)中的實(shí)際要處理的業(yè)務(wù)代碼
*/
public void handle() {}
/**
* 異常處理
*/
public void exceptionHandle() {}
/**
* finally處理
*/
public void finallyHandle() {}
}然后我們創(chuàng)建一個(gè)事務(wù)管理器,封裝一個(gè)runTransaction方法,里面就包含了上面那邊不忍直視的代碼。然后我們將Session和抽象的模板類作為參數(shù)傳入
并且將抽象的模板類中的三個(gè)公開方法填入到try{}catch{}finally{}中的各個(gè)位置。
@Component
public class TransactionManager {
@Autowired
private ApplicationContext applicationContext;
/**
* 默認(rèn)SessionFactory
*/
public static final String DEFAULT_SESSION_FACTORY = "sessionFactory";
/**
* 執(zhí)行事務(wù)
* @param session
* @param transactionManagerTemplate
*
* 使用案例:
* Session session = transactionManager.getSession();
* transactionManager.runTransaction(session, new TransactionManagerTemplate() {
* // 實(shí)際要重寫的接口
* });
*/
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();
}
}
/**
* 獲取默認(rèn)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;
}
/**
* 獲取默認(rèn)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();
}
}我們?cè)跇I(yè)務(wù)代碼中想要再次使用編程式事務(wù)時(shí),就可以通過如下方式調(diào)用:
Session session = transactionManager.getSession();
transactionManager.runTransaction(session, new TransactionManagerTemplate() {
@Override
public void handle() {
// try中要添加的業(yè)務(wù)邏輯
}
@Override
public void exceptionHandle() {
// catch中要添加的業(yè)務(wù)邏輯
}
@Override
public void finallyHandle() {
// finally中要添加的業(yè)務(wù)邏輯
}
});看,這是不是更美觀了一些呀!
以上就是淺析Java模板方法的一種使用方式的詳細(xì)內(nèi)容,更多關(guān)于Java模板方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名
這篇文章主要介紹了Java實(shí)現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個(gè)模塊,可以很方便的使用,需要的朋友可以參考下2015-06-06
dom4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猟om4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
簡單工廠模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了簡單工廠模式的相關(guān)資料,和大家一起學(xué)習(xí)靜態(tài)工廠方法模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
java數(shù)據(jù)庫操作類演示實(shí)例分享(java連接數(shù)據(jù)庫)
java數(shù)據(jù)庫操作類演示實(shí)例分享,大家參考使用吧2013-12-12
Mybatis-plus更新字段為null兩種常用方法及優(yōu)化
Mybatis Plus在進(jìn)行更新操作時(shí),默認(rèn)情況下是不能將字段更新為null的,如果要更新字段為null,需要進(jìn)行以下處理,這篇文章主要給大家介紹了關(guān)于Mybatis-plus更新字段為null的兩種常用方法及優(yōu)化,需要的朋友可以參考下2024-03-03

