问题如下:在一个点餐系统中,有着外卖单,堂食单等。对应不同的订单与不同的动作和设置会有不同的状态变化,在代码中ifelseif要写30-40多行,对于这种情况是否有更好的处理方法?举例如下:判断项:商家开启先食后付是否自动接单是否有打印机打印是否成功是否自动清台动作:下单接单拒单顾客取消单顾客支付清台结账状态:待确认待处理拒绝完成取消进行中超时申请退款如上由5种判断项组合出多种变化在每种变化中不同的动作改变订单不同的状态,像这种状态模型,除了无数的ifelseif是否有更好的方法实现?想要实现:输入动作输出状态想要一个思路,非常感谢!
2 回答
呼如林
TA贡献1798条经验 获得超3个赞
给一个大概思路吧。java实现。可以稍微参考下。packagecom.ui;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;publicclassOrderStatusService{/***映射关系列表*/publicstaticListmapperList=newArrayList (); static{/***初始化判断项、订单动作到状态的映射,这里只为演示,实际中映射关系最好保存在配置文件中或者数据库中,一般在应用启动的时候,从配置文件或者数据库加载,保存一份即可。**/OrderStatusMapperm1=newOrderStatusMapper();m1.addJudgementItems(1,2,4,6)//先吃后付and自动接单and有打印机and打印成功.addAction2statusItem(1,6)//下单动作:进行中.addAction2statusItem(7,4);//结账动作:已完成OrderStatusMapperm2=newOrderStatusMapper();m2.addJudgementItems(3,5).addAction2statusItem(2,1).addAction2statusItem(4,3);mapperList.add(m1);mapperList.add(m2);}/***是否是相等的set*@paramsource*@paramdest*@return*/publicbooleanisEqualSet(Setsource,Set dest){ if(null==source||null==dest){returnfalse;}if(source.size()!=dest.size()){returnfalse;}for(Iteratorit=source.iterator();it.hasNext();){ if(!dest.contains(it.next())){returnfalse;}}returntrue;}publicstaticvoidmain(String[]args){Orderorder=newOrder();order.setOrderAction(1);//下单order.setJudgementItems(newHashSet(Arrays.asList(1,2,4,6)));//先吃后付and自动接单and有打印机and打印成功 //获取订单下一个状态System.out.println(newOrderStatusService().getNextOrderStatus(order));//结果为6(进行中)}/***获取下一个订单状态*@paramcurOrder*@return*/publicIntegergetNextOrderStatus(OrdercurOrder){for(OrderStatusMappermapper:mapperList){if(isEqualSet(curOrder.getJudgementItems(),mapper.getJudgementItems())&&null!=curOrder.getOrderAction()){returnmapper.getAction2statusMap().get(curOrder.getOrderAction());}}returnnull;}}/***订单类型,订单动作到状态的映射。**/classOrderStatusMapper{/***判断项*/privateSetjudgementItems=newHashSet (); /***订单动作到状态关系*/privateMapaction2statusMap=newHashMap (); /***下一个订单状态*/privateIntegernextStatus;publicSetgetJudgementItems(){ returnjudgementItems;}publicOrderStatusMapperaddJudgementItems(Integer...items){if(null==items||items.length<=0){returnthis;}for(Integercur:items){this.judgementItems.add(cur);}returnthis;}publicMapgetAction2statusMap(){ returnaction2statusMap;}publicOrderStatusMapperaddAction2statusItem(Integeraction,Integerstatus){if(null==action||null==status){returnthis;}this.action2statusMap.put(action,status);returnthis;}publicIntegergetNextStatus(){returnnextStatus;}publicOrderStatusMappersetNextStatus(IntegernextStatus){this.nextStatus=nextStatus;returnthis;}}classOrder{/***判断项目*1:商家开启先食后付;*2:自动接单;*3:不自动接单*4:有打印机*5:没有打印机*6:打印成功*7:打印不成功*8:自动清台*9:不自动清台*/privateSetjudgementItems; /***订单动作*1:下单*2:接单*3:拒单*4:顾客取消单*5:顾客支付*6:清台*7:结账*/privateIntegerorderAction;/***订单状态*1:待确认*2:待处理*3:拒绝*4:完成*5:取消*6:进行中*7:超时*8:申请退款*/privateIntegerorderStatus;publicSetgetJudgementItems(){ returnjudgementItems;}publicvoidsetJudgementItems(SetjudgementItems){ this.judgementItems=judgementItems;}publicIntegergetOrderAction(){returnorderAction;}publicvoidsetOrderAction(IntegerorderAction){this.orderAction=orderAction;}publicIntegergetOrderStatus(){returnorderStatus;}publicvoidsetOrderStatus(IntegerorderStatus){this.orderStatus=orderStatus;}}
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
试试看位运算可不可以,每个比特位表示一个条件的状态.比如当前状态为:0111某个动作的执行条件为:0100即只要第二个状态位为真的时候执行运算的时候就判断0111&0100==0100就可以判断这个动作要不要执行了这样每个动作对应一个if,会比原来少一点,但是状态转换的代码可能会多一点,这个就看楼主权衡了
添加回答
举报
0/150
提交
取消