• 设计模式


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

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

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    数据源与连接池
    JavaBean
    JSP隐含对象
    kibana 报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed
    JS中key-value存取
    JS判断数组中是否包含某个值
    数据库的事务
    net 查看版本号
    同行右边浮动
    CodeFirst
  • 原文地址:https://www.cnblogs.com/hello-yz/p/4758373.html
Copyright © 2020-2023  润新知