设计模式——模板方法

最近,在预算管理系统编码的时候,发现持久化层的每个方法都存在一定程度的重复代码,而且这种重复的代码分为两中:

1、 数据更新、插入、删除时候用到的

       UpdateOperator updateOperator = new UpdateOperator();

updateOperator.setDataSourceName( "SYSDATASOURCE_DEFAULT" );

2、 数据查询时候用到的

      QueryOperator query = new QueryOperator();

       query.setDataSourceName( "SYSDATASOURCE_DEFAULT" );

上面的代码分布在每个方法中,虽然重复的代码不是很多,但是如果在一个类中重复出现多次,容易引起视觉上的疲劳。说实在话在这里重复代码不多,也用不上什么设计模式,我只是借用这个地方来阐述一下模板方法在编码中的应用。

如果能够把他们抽象出来,定义一个模板方法类,定义两个接口。如

模板方法类

public class COperatorTemplate {

   

    public Object query(IQueryAction action)

    {

       QueryOperator queryOperator = new QueryOperator();

       queryOperator.setDataSourceName( "SYSDATASOURCE_DEFAULT" );     

       return action.doInQueryActon(queryOperator);

      

    }

   

    public Object update(IUpdateAction action)

    {

       UpdateOperator updateOperator = new UpdateOperator();

       updateOperator.setDataSourceName( "SYSDATASOURCE_DEFAULT" );

      

       return action.doUpdateAction(updateOperator);

    }

}

两个接口文件

public interface IUpdateAction {

 

    Object doUpdateAction(UpdateOperator operator);

}

 



public interface IQueryAction {

    Object doInQueryActon(QueryOperator operator);

}

 

好的,现在开始写一个类,来测试一下:


public class CFbsCorpPeriodDaoImp implements IFbsCorpPeriodDao {

 

    private COperatorTemplate template = new COperatorTemplate();

    /**

      * @Description : 返回周期编号为 periodId 的预算周期是否已经使用。

      * @param periodId

      * @return 如果已经使用,返回 true ;否则,返回 false

      */

    public boolean isUsedbByPeriod( final Long periodId) {

       Boolean b = (Boolean) this . template .query( new IQueryAction(){

           public Object doInQueryActon(QueryOperator operator) {

              String sql = "select corp_id from fbs_corp_period where input_state > 0 and period_id = ? " ;

              operator.setSql(sql);

              operator.addParameter( new SqlParameter(SqlType. NUMERIC ,periodId));

              operator.access();

              RsDataSet rds = new RsDataSet(operator.getSqlResultSet());

              if (rds. rowCount > 0)

                  return new Boolean( true );

              else

                  return new Boolean( false );

           }

       });

       return b.booleanValue();

    }

}

用匿名类的方式来实现 IQueryAciton 接口。我们只需要在 doInQueryAction 方法中只关注数据库访问的 sql 语句和获取结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值