- 策略模式是对算法的包装,可以把代码中的算法和算法本身剥离开来,用不同的对象进行管理
-
作用:
-
可以用来解决多重if判断。
-
-
-
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
抽象策略角色:
-
/** * 策略模式-具体抽象角色 */ public interface PayStrategy { public String toPayHtml(); }
具体策略类:
-
/** * 策略模式之具体策略 */ @Component public class AliPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用支付宝支付"; } }
/** * 策略模式之具体策略 */ @Component public class MiPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "小米支付接口"; } }
/** * 策略模式之具体策略 */ @Component public class WxPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用微信支付"; } }
环境(context)角色:
-
/** * 策略模式-环境(Context)角色 * 通过枚举获取beanId * 再通过beanId从Spring容器中获取具体引用 * 通过父类接收子类引用(向上转型) */ public class StrategyContext { public static PayStrategy getPayStrategy(String strategyType){ //通过枚举获取beanId String beanid = PayEnumStrategy.valueOf(strategyType).getBeanid(); //再通过beanId从Spring容器中获取具体引用 PayStrategy bean = (PayStrategy) SpringUtils.getBean(beanid); return bean; } }
枚举类(维护beanId):
** * 策略模式-beanId配置枚举 */ public enum PayEnumStrategy { ALI_PAY("aliPayStrategy"), MI_PAY("miPayStrategy"), WX_PAY("wxPayStrategy"), ALI_PAY_LATE("aliPayCallbackTemplate"), UNION_PAY_LATE("unioPayCallbackTemplate"); private String beanid; PayEnumStrategy(String beanid){ this.setBeanid(beanid); } public String getBeanid() { return beanid; } public void setBeanid(String beanid) { this.beanid = beanid; } }
测试:
-
@RestController public class StratrgyController { @RequestMapping("/pay") //传入枚举 public String pay(String payCode){ PayStrategy payStrategy = StrategyContext.getPayStrategy(payCode); return payStrategy.toPayHtml(); } }
beanId可以枚举维护,也可以通过数据库表维护
-
总结:一个接口的多个实现,每个实现都是一个策略,环境角色通过传入的参数获取到具体的策略并实例化赋予父类接收。
-
优点:
-
提高了代码的拓展性(算法可以自由添加)
算法可以自由切换
缺点:
-
如果算法过多,会导致策略类偏多,维护起了比较麻烦
-------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列
-
Java设计模式之策略模式
最新推荐文章于 2024-08-23 20:26:46 发布