今天下午主要研究了设计模式中的Template Method(模版方法设计模式)。
在Spring中,对各种O/RM进行了封装,比如对Hibernate有HibernateTemplate封装;对JDBC有jdbcTemplate封装。这些封装均实践了Template Method设计模式。
拿HibernateTemplate来说,Spring通过该类对Hibernate的事务管理进行了封装。
/* 本帖准备模拟HibernateTemplate的实现,该类是Spring对Hibernate操作事务的封装,采用了Template Method设计模式*/ /* 当很多方法的执行体有大量重复代码时(比如对事务的处理), 可以考虑将不动的部分抽取出来而不同的部分做成接口的形式,共同形成一个方法 */ /* 通过实现接口的形式,将不同的业务逻辑加到方法中 */
直接上代码:
1. 接口:
public interface MyHibernateCallBack { public void doInHibernate(Session session); }
2. MyHibernateTemplate
public class MyHibernateTemplate { @Autowired private SessionFactory sessionFactory; /* 模拟HibernateTemplate的实现,该类是Spring对Hibernate操作事务的封装,采用了Template Method设计模式*/ /* 当很多方法的执行体有大量重复代码时(比如对事务的处理), 可以考虑将不动的部分抽取出来而不同的部分做成接口的形式,共同形成一个方法 */ /* 通过实现接口的形式,将不同的业务逻辑加到方法中 */ /* 共同代码体 */ private void executeWithSession(MyHibernateCallBack callback){ Session session = null; try { session = sessionFactory.openSession(); session.beginTransaction(); /* 不同之处,则根据上下文抽取出接口 */ callback.doInHibernate(session); session.getTransaction().commit(); } catch (RuntimeException e){ e.printStackTrace(); if (session != null){ session.getTransaction().rollback(); } } finally { if (session != null){ session.close(); } } } public void save(final User user) { /* 通过内部类实现接口 */ MyHibernateCallBack callBack = new MyHibernateCallBack() { @Override public void doInHibernate(Session session) { session.save(user); } }; executeWithSession(callBack); } }
3. 调用:
public class UserDAOImpl implements UserDAO { @Resource private MyHibernateTemplate myHibernateTemplate; @Override public void save(User user) { myHibernateTemplate.save(user); //一句搞定! } }
说实在的,重要的是思想!