今天给大家分享攻略模式。具体提纲如下:生活案例在这个互联网时代,尤其是在城市里,有一群人骑着电瓶车,穿梭于大街小巷,其中,这些人就是外卖小哥。为了叫外卖,我也点了很多。有一次,在点外卖的时候,突然想到了一个设计模式---策略模式。什么是策略模式?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;}privatestaticfinalMap
