当前位置: 首页 > 科技观察

优秀的程序员早就学会了用“状态模式”代替if-else

时间:2023-03-14 15:02:58 科技观察

2020年已经进入倒计时,你立下的flag完成了吗?2020年不容易做“鼠”,希望2021年可以做“牛”。.简介状态模式是一种行为设计模式。它的设计理念是当对象的内部状态发生变化时,其行为也会随之改变。状态和行为之间存在一对一的对应关系。这种模式主要用于对象的行为依赖于它的状态,并且它的行为随着状态的变化而切换的情况。状态模式UML类图类图说明State:抽象状态接口(也可以定义为抽象类),封装了所有状态对应的行为。ConcreteStateA/B:具体状态类,实现了抽象状态接口,根据其对应的状态实现了接口中定义的方法,还有一个功能是指示如何过渡到下一个状态。Context:环境(context)角色,该类负责状态切换,同时持有一个State实例,代表当前环境的状态。案例讲解案例:通过状态模式实现自助售货机功能。StateinterfacepublicinterfaceState{//choosegoodsvoidchoose();//paymentbooleanpayment();//distributegoodsvoiddispenseCommodity();}选择商品状态类publicclassChooseGoodsimplementsState{VendingMachinemachine;publicChooseGoods(VendingMachinemachine){this.machine=machine;}@Overridepublicvoidchoose(){if(machine.getCount()>0){System.out.println("商品选择成功,请及时支付!");machine.setState(machine.getPaymentState());}else{System.出去。println("抱歉,商品已售罄!");machine.setState(machine.getEmptyState());}}@Overridepublicbooleanpayment(){System.out.println("请先选择商品!");returnfalse;}@OverridepublicvoiddispenseCommodity(){System.out.println("请先选择商品!");}}支付状态类publicclassPaymentStateimplementsState{VendingMachinemachine;publicPaymentState(VendingMachinemachine){this.machine=machine;}@Overridepublicvoidchoose(){System.out.println("商品已购买,请勿重复选择");}@Overridepublicbooleanpayment(){Randomrandom=newRandom();intnum=random.nextInt(10);if(num%2==0){System。出去。println("支付到成就!");machine.setState(machine.getDispenseCommodityState());returntrue;}System.out.println("支付失败,请重新支付!");returnfalse;}@OverridepublicvoiddispenseCommodity(){System.out.println("请请先完成支付!”);}}ItempublicclassEmptyStateimplementsState{VendingMachinemachine;publicEmptyState(VendingMachinemachine){this.machine=machine;}@Overridepublicvoidchoose(){System.out.println("抱歉,产品已售罄!");}@Overridepublicbooleanpayment(){System.out.println("抱歉,商品已售罄!");returnfalse;}@OverridepublicvoiddispenseCommodity(){System.out.println("抱歉,商品已售罄!");}}分发商品状态类publicclassDispenseCommodityStateimplementsState{VendingMachinemachine;publicDispenseCommodityState(VendingMachinemachine){this.machine=machine;}@Overridepublicvoidchoose(){System.out.println("请及时取走你的商品!");}@Overridepublicbooleanpayment(){System.out.println("请您及时取走您的商品!");returnfalse;}@OverridepublicvoiddispenseCommodity(){System.out.println("请及时领取您的物品!");machine.setState(machine.getChooseGoods());}}Vendingmachine=>ContextrolepublicclassVendingMachine{//表示当前状态privateStatestate=null;//商品数量privateintcount=0;privateStatechooseGoods=newChooseGoods(this);privateStatepaymentState=newPaymentState(this);privateStatedispenseCommodityState=newDispenseCommodityState(this);privateStateemptyState=newEmptyState(this);publicVendingMachine(intcount){this.count=count;this.state=this.getChooseGoods();}//购买商品publicvoidpurchase(){//选择商品state.choose();//支付成功if(state.payment()){//分发商品state.dispenseCommodity();}}//获取商品后减一商品publicintgetCount(){returncount--;}//get和set方法...}客户端测试类publicclassClient{publicstaticvoidmain(String[]args){VendingMachinemachine=newVendingMachine(1);for(inti=1;i<4;i++){System.out.println(""+i+"thpurchase");machine.purchase();}}}执行结果总和mary1.状态模式将每个状态对应的行为封装到一个类中,大大提高了代码的可靠性和可读性。并且通过这样的设计,可以去掉多余的if-else语句,方便代码维护。2、状态模式符合“开闭原则”,添加和删除状态方便。3.凡事有利有弊,状态模式也不例外。最值得注意的问题是每个状态必须对应一个类。当状态过多时,会产生大量的类,从而增加维护成本。4.应用场景:当一个需求有很多状态,状态会相互转换,不同的状态对应不同的行为,可以考虑使用“状态模式”