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

模板方法

时间:2018-06-18 18:52:19      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:llb   接口   dos   void   upd   问题:   ack   ===   cti   

 我们先来看一段代码:

        public void save(User user){
            Session sesion = sessionFactory.openSession();
            Transaction tx = null;
            tyr{
                tx = session.beginTransaction();
                //=================
                    session.save(user);
                //=================
                tx.commit();
            
            }catch(Excaption e){
                tx.rollback();
                throw e;    
            }finally{
                session.close();
            }
        }

问题:我们在写Hibernate的增删改查的时候,会重复写很多类似的代码,
    
我们都发现了一个规律,很多操作,如:save,update,delete等
    
都只需要将下面的代码替换即可,其余的都可以不用改动:

    //=================
        session.save(user);
    //=================
    
我们可以不可以将session.save(user)以外的方法抽取成一个公共的方法呢?


    做法一:我们把 public void save(User user)方法放在一个基类中去
           然后,让实现子类去重写beforeSave方法。
        
           做法一变体:
           我们把 public void save(User user)方法放在一个抽象类中去
           然后,让实现子类去实现beforeSave方法。

    public class Dao{
         public void save(Object entity){
            Session sesion = sessionFactory.openSession();
            Transaction tx = null;
            tyr{
                tx = session.beginTransaction();
                //=================
                    doSave(sesion, entity)
                //=================
                tx.commit();
            
            }catch(Excaption e){
                tx.rollback();
                throw e;    
            }finally{
                session.close();
            }
        }

        //让子类去重写该方法,完成具体的业务逻辑。session 操作环境,obj 数据
        public void beforeSave(Session sesion, Object obj){}
    }

    
    做法二:利用回调接口

    public interface HibernateCallback{
        Object doSomething(Session sesion);
    }

    public  class Dao{
         private Object executor(HibernateCallback cb){
            Session sesion = sessionFactory.openSession();
            Transaction tx = null;

            tyr{
                tx = session.beginTransaction();
                //=================
                    Object retVal = cb.doSomething(sesion);
                //=================
                tx.commit();
                return retVal;
            }catch(Excaption e){
                tx.rollback();
                throw e;    
            }finally{
                session.close();
            }
        }

        public Object save(final User user){
            
            return executor(new HibernateCallback(){
                public Object doSomething(Session sesion){
                    //TODO...
                    return sesion.save(user);
                    
                }        
            } );
            
        }
    }

方法一是利用继承来做。

方法二是利用组合类做。

实际项目中根据实际情况,可以选择不同的实现方法
 

模板方法

标签:llb   接口   dos   void   upd   问题:   ack   ===   cti   

原文地址:https://www.cnblogs.com/fangzirui/p/9195744.html

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