最近,在预算管理系统编码的时候,发现持久化层的每个方法都存在一定程度的重复代码,而且这种重复的代码分为两中:
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 语句和获取结果。