分享一个近期工作中订单功能模块重构设计图

分享一个近期工作中订单功能模块重构设计图_第1张图片

本不想加任何文字信息描述,纯粹就分享一张设计图,但又怕一张图片没法体现更多的信息,加了些文字希望对大家有些许的帮助,这也是分享的意义所在。

说明:

1、IOrder:斜体字表示抽象类接口

2、+handleProdInst():List:斜体字表抽象方法;+createPubReq():表示类方法

3、圆圈表接口、三角箭头表示继承或是接口实现、实心菱形表示类间组合关系

图片内容分为三块:(1)订单实现;(2)订单状态处理;(3)领域实现类

模块设计的目的在于构造符合外系统要求的xml报文。

(1)订单实现

a、订单包括报文头部和报文内容。头部主要包含请求处理的业务动作、请求发送方接收方、请求时间、系统签名、订单流水==



	
		600105A070201407100000156934
		0
		FJBUS100
		FJSVC101
		FJSVC10120140710
		1
		600105
		600105A070
		
		600105
		6001050001
		20140710215056
	
	
		

		


后续将由专门的文章介绍,如何通过type属性转换SOO节点内容到相应对象。

b、头部构造相对简单。重要的是报文内容构造。在通过对订单流程的梳理之后,我发现所有的订单虽然在处理逻辑上不一样,但是处理流程是一样的。于是就将订单接口实现为一个订单模板类,具体来讲是“模板设计模式”在该类设计上的具体应用。orderUp方法调用了类中所有抽象handleXxx()方法,所有这些抽象方法都将在子类中根据需要实现。

public List orderUp(CREATE_PRE_SALE_ORDER_REQ req) throws ManagerException{
		
		List list = new ArrayList();
		
		//处理客户信息
		list.addAll(handleCustType(req,null));
		
		//e9a8添加销售品
		ICallback relProdOfferInstCbk = new ICallback() {
			@Override
			public void hook(Object... objs) {
			}
		};
		relProdOfferInstCbk.setCustId(req.getCUST_INFO().getCUST_TYPE().getCUST_ID());
		relProdOfferInstCbk.setCustName(req.getCUST_INFO().getCUST_TYPE().getCUST_NAME());
		relProdOfferInstCbk.setLanId(req.getCUST_INFO().getCUST_TYPE().getLAN_ID());
		//处理成员销售品信息
		list.addAll(handleRelMainProdOfferInst(req,relProdOfferInstCbk));
		
		
		//处理销售品信息
	    for (PROD_OFFER_INST_DETAIL.SERVICE_OFFER_ID_LIST serviceOffer : req.getPROD_OFFER_INST_DETAIL().getSERVICE_OFFER_ID_LIST()) {
			ICallback prodOfferCbk = new ICallback() {
				@Override
				public void hook(Object... objs) {}
			};
			prodOfferCbk.setCustId(req.getCUST_INFO().getCUST_TYPE().getCUST_ID());
			prodOfferCbk.setCustName(req.getCUST_INFO().getCUST_TYPE().getCUST_NAME());
			prodOfferCbk.setLanId(req.getCUST_INFO().getCUST_TYPE().getLAN_ID());
			
			//处理主销售品信息
			list.addAll(handleProdOfferInst(req,serviceOffer,prodOfferCbk));
			
			//处理关联产品信息
			list.addAll(handleOfferProdInstRela(req,serviceOffer,prodOfferCbk));
	    }		
	    
	    //处理产品信息
	    List pid_list = req.getPROD_OFFER_INST_DETAIL().getPROD_INST_DETAIL();
	    for(PROD_INST_DETAIL pid : pid_list){
	    	for(cn.ffcs.cmp.bean.qryprodinstdetailbycdn.PROD_INST_DETAIL.SERVICE_OFFER_ID_LIST serviceOffer : pid.getSERVICE_OFFER_ID_LIST()){
				ICallback prodInstCbk = new ICallback() {
					@Override
					public void hook(Object... objs) {
					}
				};
				prodInstCbk.setCustId(req.getCUST_INFO().getCUST_TYPE().getCUST_ID());
				prodInstCbk.setCustName(req.getCUST_INFO().getCUST_TYPE().getCUST_NAME());
				prodInstCbk.setLanId(req.getCUST_INFO().getCUST_TYPE().getLAN_ID());
								
				//处理产品信息
				list.addAll(handleProdInst(req,pid,serviceOffer,prodInstCbk));
		        
	    	}
	    }
	    
		//处理T02
		ICallback relProdInstCbk = new ICallback() {
			@Override
			public void hook(Object... objs) {}
		};
		relProdInstCbk.setCustId(req.getCUST_INFO().getCUST_TYPE().getCUST_ID());
		relProdInstCbk.setCustName(req.getCUST_INFO().getCUST_TYPE().getCUST_NAME());
		relProdInstCbk.setLanId(req.getCUST_INFO().getCUST_TYPE().getLAN_ID());
		list.addAll(handleFuncProdInst(req, relProdInstCbk));
	    
	    //处理T04
		ICallback relProdOfferCbk = new ICallback() {
			@Override
			public void hook(Object... objs) {}
		};
		relProdOfferCbk.setCustId(req.getCUST_INFO().getCUST_TYPE().getCUST_ID());
		relProdOfferCbk.setCustName(req.getCUST_INFO().getCUST_TYPE().getCUST_NAME());
		relProdOfferCbk.setLanId(req.getCUST_INFO().getCUST_TYPE().getLAN_ID());
		list.addAll(handleRelProdOfferInst(req,relProdOfferCbk));
		return list;
	} 
  

c、OrderOperatorImpl是IOrderOperator的一个通用实现。在实现类的设计中,考虑到直接将领域实现类同订单实现组合在一起就会引发动作调用者和动作实现的严重耦合,再通过观察所有的动作请求都有很好的节点封装(这里没法提供我们的输入schema定义,望见谅),为彻底的执行动作调用者和动作实现者的分离,在两者之间加入了基于“命令设计模式”的实现类XxxCmd,动作调用者将动作实现类通过构造函数的形式委托

	@Override
	public List handleProdInst(CREATE_PRE_SALE_ORDER_REQ req,cn.ffcs.cmp.bean.qryprodinstdetailbycdn.PROD_INST_DETAIL pid,cn.ffcs.cmp.bean.qryprodinstdetailbycdn.PROD_INST_DETAIL.SERVICE_OFFER_ID_LIST serviceOffer,ICallback callback) throws ManagerException {
		iCommand = new ProdInstCmd(prodInstType);
		return iCommand.execute(callback,req,pid,serviceOffer);
	} 
  
d、XxxCmd类继承自ICommand类,所有的Cmd实现类都只实现了execute方法,下面是一个Cmd实现

public class ProdInstCmd extends ICommand {

//	private static final Logger log = Logger.getLogger(ProdInstCmd.class);
	
	private IProdInstType prodInstType;
	
	public ProdInstCmd(){}
	
	public ProdInstCmd(IProdInstType prodInstType){
		this.prodInstType = prodInstType;
	}

	@Override
	public List execute(ICallback callback,Object...obj) {
		List list = new ArrayList();
		CREATE_PRE_SALE_ORDER_REQ req = (CREATE_PRE_SALE_ORDER_REQ)obj[0];
		PROD_INST_DETAIL pid = (PROD_INST_DETAIL)obj[1];
		SERVICE_OFFER_ID_LIST serviceOffer = (SERVICE_OFFER_ID_LIST)obj[2];
		if(Constants.SERVICE_OFFER_PROD_ADD.equals(serviceOffer.getSERVICE_OFFER_ID())) {//订购
			list.addAll(prodInstType.addProdInstTypeReq(req,pid, serviceOffer, callback));
		}else if(Constants.SERVICE_OFFER_PROD_MOD_USIM.equals(serviceOffer.getSERVICE_OFFER_ID())) { //补换卡
			list.addAll(prodInstType.modUsimProdInstTypeReq(pid, serviceOffer, callback));
		}else if(Constants.SERVICE_OFFER_PROD_DEL.equals(serviceOffer.getSERVICE_OFFER_ID())) { //拆机
			list.addAll(prodInstType.delProdInstTypeReq(pid, serviceOffer, callback));
		}else if(Constants.SERVICE_PROD_ADDRESS_MOVE.equals(serviceOffer.getSERVICE_OFFER_ID())) { //移机
			list.addAll(prodInstType.moveProdInstTypeReq(pid, serviceOffer, callback));
		}else if(Constants.SO_TYPE_PROD_ATTE.equals(serviceOffer.getTYPE())){//产品变更
			Map memberModify = null;//变更构成节点
	        List pimmlList = pid.getPROD_INST_MEMBER_MODIFY_LIST();
	        if(pimmlList != null && pimmlList.size() > 0){
	        	memberModify = new HashMap();// 只存放变更的构成节点
	            for(PROD_INST_DETAIL.PROD_INST_MEMBER_MODIFY_LIST pimml:pimmlList){
	            	String newValue = (String)ReflectUtils.getFieldValueByName(pimml.getMEMBER_KEY_ID(),pid.getPROD_INST());
	            	if(!pimml.getOLD_MEMBER_VALUE_ID().equals(newValue)){
	                    memberModify.put(pimml.getMEMBER_KEY_ID(),newValue);
	            	}
	            }
	        }
	        list.addAll(prodInstType.modProdInstTypeReq(pid, serviceOffer, memberModify, callback));
		}
		return list;
	}	
} 
  
建议平时设计功能模块的时候多动手画设计图,不管是借助工具还是在本子上画草图,不仅可以锻炼设计的感觉,而且还很容易发现设计上的不足,以上设计就有很多个问题待完善。

如果你办法看到大图,可在浏览器点击以下链接,放大查看

https://img-blog.csdn.net/20140714112800450?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VueW91bGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

你可能感兴趣的:(分享一个近期工作中订单功能模块重构设计图)