模板方法

Posted fangzirui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法相关的知识,希望对你有一定的参考价值。

 我们先来看一段代码:

        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);
                    
                }        
            } );
            
        }
    }

方法一是利用继承来做。

方法二是利用组合类做。

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











































































































以上是关于模板方法的主要内容,如果未能解决你的问题,请参考以下文章

模板方法模式(Template Method Pattern)

设计模式—— 十 :模板方法模式

七模板方法模式

设计模式整理_模板模式

模板方法模式:剖析模板方法在JDKTomcatMybatis等开源框架中的应用

模板方法模式:剖析模板方法在JDKTomcatMybatis等开源框架中的应用