萌新求教!订单状态变化如何处理?各位有什么建议?

在一个点餐系统中,有着外卖单,堂食单等。对应不同的订单与不同的动作和设置会有不同的状态变化,在代码中ifelseif要写30-40多行,对于这种情况是否有更好的处理方法?举例如下:判断项:商家开启先食后付是否自动接单是否有打印机打印是否成功是否自动清台动作:下单接单拒单顾客取消单顾客支付清台结账状态:待确认待处理拒绝完成取消进行中超时申请退款如上由5种判断项组合出多种变化在每种变化中不同的动作改变订单不同的状态,像这种状态模型,除了无数的ifelseif是否有更好的方法实现?想要实现:输入动作输出状态想要一个思路,非常感谢!
慕侠2389804
浏览 509回答 2
2回答

侃侃无极

给一个大概思路吧。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,Setdest){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

牛魔王的故事

试试看位运算可不可以,每个比特位表示一个条件的状态.比如当前状态为:0111某个动作的执行条件为:0100即只要第二个状态位为真的时候执行运算的时候就判断0111&0100==0100就可以判断这个动作要不要执行了这样每个动作对应一个if,会比原来少一点,但是状态转换的代码可能会多一点,这个就看楼主权衡了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript