码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式 - Template Method

时间:2015-08-25 21:15:56      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

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

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

设计模式 - Template Method

标签:

原文地址:http://www.cnblogs.com/hello-yz/p/4758373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!