设计模式

今天下午主要研究了设计模式中的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);  //一句搞定!
    }
}

说实在的,重要的是思想!

清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
原文地址:https://www.cnblogs.com/hello-yz/p/4758373.html