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

点外卖让我想起了攻略模式

时间:2023-03-18 11:36:31 科技观察

今天给大家分享攻略模式。具体提纲如下:生活案例在这个互联网时代,尤其是在城市里,有一群人骑着电瓶车,穿梭于大街小巷,其中,这些人就是外卖小哥。为了叫外卖,我也点了很多。有一次,在点外卖的时候,突然想到了一个设计模式---策略模式。什么是策略模式?Strategy模式:英文中的StrategyPattern是指算法族的定义,它们被单独封装,以便于相互替换。这种设计模式允许算法的改变不会影响使用算法的用户。Chinese定义一系列算法,封装每个算法,并使它们可以互换。粗略的意思:定义一组算法,封装每一个算法,使它们可以互换。在策略模式中,类的行为或其算法可以在运行时改变。这种类型的设计模式是一种行为模式。策略模式通用代码的java代码实现如下:");}}//具体策略类ConcreteStrategystaticclassConcreteStrategyBimplementsIStrategy{@Overridepublicvoidalgorithm(){System.out.println("StrategyB");}}//上下文staticclassContext{privateIStrategymStrategy;publicContext(IStrategystrategy){this.mStrategy=strategy.Strategy;}public.algorithm();}}publicstaticvoidmain(String[]args){//选择具体策略IStrategystrategy=newConcreteStrategyA();//创建上下文Contextcontext=newContext(strategy);//客户端直接让上下文执行算法context.algorithm();}}从上面的通用代码,我们可以知道它的UML图。StrategyModeUMLDiagramStrategyMode中的角色从UML类图中我们可以看出,StrategyMode主要包括三个角色:上下文角色(Context):用于操作策略的上下文,屏蔽高层模块(客户端)的访问策略,直接访问算法,封装可能的变化;抽象策略角色(Strategy):指定策略或算法的行为;具体策略角色(ConcreteStrategy):具体策略或算法实现;策略模式的优缺点。闭包原则避免使用多次转换语句,如:if...else,switch语句。使用策略模式可以提高算法的保密性和安全性。缺点:客户必须了解所有策略并决定使用哪种策略。代码中有很多策略类,增加了后期维护的难度。策略模式的使用场景在日常开发中。策略模式适用于以下三种场景:对于同一类问题,有多种处理方式,每种处理方式都可以独立解决问题。该算法需要自由切换场景。需要屏蔽算法规则的场景还是不太容易理解。下面我们用生活案例来实现一下,让大家知道策略模式是如何使用的。支付案例代码重构,外部订单三个版本,在选择支付方式的时候,我觉得这个功能,我们可以模仿使用策略模式来实现。下面我们通过三个迭代来实现,很有意思。第一版首先定义了一个抽象类Pay://定义一个抽象类,我们可以把一些常用的函数放在抽象类中去实现//例如:比较可用余额和本次的支付金额,返回“paymentpublicabstractclassPay{abstractvoiddoPay();}下面模拟三种支付方式:.out.println("使用银联支付");}}publicclassWechatPayextendsPay{@OverridepublicvoiddoPay(){System.out.println("使用微信支付");}}再次支付:publicclassPayTest{publicstaticvoidmain(String[]args){//赋予选择权Orderorder=newOrder(newWechatPay());order.pay();*}}运行结果:使用微信支付,所以我们使用策略模式来实现简单版的支付,但是有就是一个很不舒服的地方,就是每次这个时候,你都要最终新建一个支付方式对象。鉴于此,我们重构了第一个版本。第二个版本之前的实现保持不变。变化的是,发起支付时,只要从前端传入一个key,实现如下:publicclassPayTest{publicstaticvoidmain(String[]args){StringpayKey="Wechat";Orderorder=null;//通过判断前端传来的key,判断使用哪种支付方式=newOrder(newWechatPay());}elseif(payKey.equals("union")){order=newOrder(newUnionPay());}else{//给一个默认方法order=newOrder(newWechatPay());}order.pay();}}运行的结果是使用微信支付这样我们就可以实现了,然后通过前端传过来的key选择对应的支付方式。但是问题又来了,如果支付方式越来越多,这里的if...else会不会越来越多?后续维护成本不是越来越大吗?因此,第三版将可用。第三版在第二版中,会有很多if...else,给后续的代码维护带来不便,所以在这一版中,我们对其进行了重构,引入了注册单例模式。importjava.util.HashMap;importjava.util.Map;publicenumPayStrategyEnum{ALI_PAY("阿里"),WECHAT_PAY("微信"),UNION_PAY("联合"),//默认使用微信支付DEFAULT_PAY("微信");私人字符串键;PayStrategyEnum(Stringkey){this.key=key;}privatestaticfinalMappayKeyMap=newHashMap();static{payKeyMap.put(ALI_PAY.key,newAliPay());payKeyMap.put(WECHAT_PAY.key,newWechatPay());payKeyMap.put(UNION_PAY.key,newUnionPay());payKeyMap.put(DEFAULT_PAY.key,newWechatPay());}publicstaticPaygetPay(StringpayKey){if(!payKeyMap.containsKey(payKey)){returnpayKeyMap.get(DEFAULT_PAY.key);}returnpayKeyMap.get(payKey);}}然后,当订单支付时,就变成了这样:(支付密钥));order.pay();}}运行结果为使用微信支付。这样我们就成功的避免了很多if...else,很爽!其实上面三个版本的代码我觉得一点都不酷,这就是设计模式的力量。PS:关于以上三个版本,其实我们还可以继续完善和重构。有兴趣的可以试试如何继续重构。总结一下,今天的攻略模式就到这里了。事实上,在大多数情况下,设计模式并不是单独存在的,而是与多种设计模式结合使用的。策略模式使用面向对象的继承和多态机制,从而实现同一行为在不同场景下的不同实现。最难忘的案例:我们可以使用不同的交通工具去北京,飞机、高铁、汽车、汽车、自行车。方法有很多种,选择你喜欢的一种。最后用一句话概括战略模型:条条大路通罗马。转载本文请联系Java后端技术全栈公众号。