Java设计模式之策略模式
2019-05-29 16:57
141 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39254815/article/details/90672265
- 策略模式是对算法的包装,可以把代码中的算法和算法本身剥离开来,用不同的对象进行管理
-
作用:
可以用来解决多重if判断。
-
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
抽象策略角色:
[code] /** * 策略模式-具体抽象角色 */ public interface PayStrategy { public String toPayHtml(); }
具体策略类:
[code]/** * 策略模式之具体策略 */ @Component public class AliPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用支付宝支付"; } }
[code]/** * 策略模式之具体策略 */ @Component public class MiPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "小米支付接口"; } }
[code] /** * 策略模式之具体策略 */ @Component public class WxPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用微信支付"; } }
环境(context)角色:
[code] /** * 策略模式-环境(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):
[code]** * 策略模式-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; } }
测试:
[code]@RestController public class StratrgyController { @RequestMapping("/pay") //传入枚举 public String pay(String payCode){ PayStrategy payStrategy = StrategyContext.getPayStrategy(payCode); return payStrategy.toPayHtml(); } }
beanId可以枚举维护,也可以通过数据库表维护
总结:一个接口的多个实现,每个实现都是一个策略,环境角色通过传入的参数获取到具体的策略并实例化赋予父类接收。
优点:
提高了代码的拓展性(算法可以自由添加)
算法可以自由切换
缺点:
如果算法过多,会导致策略类偏多,维护起了比较麻烦
-------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列
相关文章推荐
- java设计模式之 策略模式
- All About JAVA 关于设计模式中的“策略模式”
- java设计模式---策略模式
- [设计模式] - 策略模式(Java篇)
- java设计模式之策略模式
- OOP设计模式[JAVA]——01策略模式
- Java设计模式——策略模式
- Java设计模式 Design Pattern:策略模式 Strategy Pattern
- 设计模式之三 --- 策略模式(Strategy Pattern) (java)
- JAVA设计模式---策略模式-2011-05-13
- Java设计模式十: 策略模式(Strategy)
- java设计模式---策略模式
- Java设计模式笔记之策略模式
- 初学者学Java设计模式(二)---------策略模式
- java设计模式之策略模式
- [设计模式] - 策略模式(Java篇)
- java设计模式之策略模式
- Java设计模式——策略模式
- java 设计模式学习笔记十五 strategy 策略设计模式
- java 设计模式 桥接模式和策略模式的区别