您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java模板方法的使用方式有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java模板方法的使用方式有哪些文章都會有所收獲,下面我們一起來看看吧。
為什么我會想到使用模板方法呢?
在日常開發中,我們經常需要使用編程式事務來解決一些實在的業務問題。以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模板方法的使用方式有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。