请教账单领域的实体,值对象与服务的设计问题.

请教账单领域的实体,值对象与服务的设计问题. 将一堆账单按照类型(自来水,电力,燃气,电信)的不同分别挑拣出来,然后按照类型放在不同的篮子里面,对于这种业务场景. 我写了一段代码,但感觉明显是过程思维,而且里面有很多if...else...,请教我如何将其使用模式重构为OO代码?如何彻底消除if...else... 账单的类为: public class Bill { private String barCode;//账单条码 private float billAmount;//账单 金额 private float commission;//手续费 private float totalAmount;//总金额 private int type;// 账单类型,比如(自来水,电力,燃气,电信) private int commitStatus;//提交状态 private int payStatus;//是否成功缴费 private Date commitDate;//账单提交时间 private MemberCard card; //支付账单所使用的会员卡 private BsOnlineTradeRecord record;//支付所产生的交易记录 private Date billDate;//账单日期 private Date payDate;//支付日期 private int finalStatus;//账单最终出来状态

/* set() and get()方法省略 */

}//end of class

账单服务类中的一个分拣不同账单的方法: private Map> sortBills(List bill){ List waterBills = new ArrayList(); List electricBills = new ArrayList(); List gasBills = new ArrayList(); List telecomBills =new ArrayList(); for(Bill b:bill){ int bType = b.getType(); if(bType==10){//账单类型码是10为电力账单 electricBills.add(b); continue; }else if(bType==5||bType==6||bType==7||bType==8||bType==9||bType==19||bType==20){ //账单类型码是5,6,7,8,9,19,20中一个就为自来水账单 waterBills.add(b); continue; }else if(bType==1||bType==2||bType==3){ //账单类型码是1,2,3中一个就为燃气账单 gasBills.add(b); continue; }else if (bType==12){//账单类型码是12为电信账单 telecomBills.add(b); continue; }//end of if...else... }//end of for... Map> resultMap = new HashMap>(); resultMap.put("water", waterBills); resultMap.put("electric", electricBills); resultMap.put("gas", gasBills); resultMap.put("telecom", telecomBills); return resultMap; }//end of method

请各位大哥多多指教?感觉是Model Bill中的内容有点臃肿了. 一些属性MemberCard card 是可以拉出来做值对象的.而账单中似乎也不应该将交易记录 BsOnlineTradeRecord record;作为账单的属性.请多指教!

Bill这个实体是华而不实,肯定要分解的,分解成一个聚合体。 再配合Specification来替代一些if else约束。