上面的策略模式的应用示例是不是很简单,类似应用也有很多,比如要对接第三方支付,不同的支付平台有不同的支付API,这个API操作都可以抽象成策略接口,客户端发起特定平台的支付接口时,我们只需调用具体的支付策略类执行,并且每个支付策略类相互独立,可替换。
适用场景本节最后简单总结下策略模式的适用场景:
如果一个对象有很多的行为,它们的实现目的相同,而这些行为使用了多重的条件选择语句来实现。
当一个系统需要动态地切换算法,会选择一种算法去执行。
客户端类不需要知道具体算法的实现细节,只要调用并完成所需要求。
Lambda 与 策略模式JDK 8 之后,利用Lambda可以提供策略模式更加精简的实现,如果策略接口是一个函数接口,那么不需要声明新的类来实现不同策略,直接通过传递Lambda就可实现,并且更加简洁,具体使用方式参见下方代码:
/** * Context 对象 */ public class Validator { private final ValidationStrategy strategy; public Validator(ValidationStrategy v) { this.strategy = v; } public boolean validate(String s) { return strategy.execute(s); } } /** * 策略接口 */ @FunctionalInterface public interface ValidationStrategy { boolean execute(String s); } numericValidator = new Validator((String s) -> s.matches("[a-z]+")); b1 = numericValidator.validate("aaaa"); // true lowerCaseValidator = new Validator((String s) -> s.matches("\\d+")); b2 = lowerCaseValidator.validate("bbbb"); // false结合 Lambda 的策略模式更适合用于处理简单算法操作的场景,如果算法实现复杂过于冗长复杂,还是建议拆分成单个类进行实现。
策略模式的注意点策略模式使用起来虽然简单,但它的灵活性在许多项目都能见到其身影,在使用时也有需要注意的地方,下面我们就来看下:
策略模式中每个算法都是完整,不可拆分的原子业务,并且多个算法必须是可以相互替换,,而用哪个算法由外部调用者决定。
当如果具体策略类超过4个,需要使用混合模式减少类膨胀和对外暴露的问题,通过其他模式修正:工厂方法模式,代理模式,享元模式
策略模式的优缺点一个设计模式的引入必存在它合理的地方和不足,最后我们再说说下策略模式的优缺点。
优点使用策略模式,可以在不修改原有系统的基础上更换算法或行为,可以灵活地增加新的算法或行为,提供了系统的扩展性
策略模式提供了对一类算法进行管理维护。
使用策略模式可以避免使用多重条件判断,由外部模块决定所要执行的策略类。
缺点客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
会产生很多策略类,使得类的项目增多。
结语到这里,本文对策略模式的学习就此结束,当然关于策略模式的内容远不止这些,配合其他模式还有用法,感兴趣了的同学可以参考文末提供的资料链接进一步深入学习。也欢迎扫码关注微信公众号:「闻人的技术博客」,定期分享Java技术干货,共同进步。
推荐阅读一文掌握 Spring Boot Profiles
如何优雅关闭 Spring Boot 应用
需要接口管理的你了解一下?
Java 之 Lombok 必知必会
Java 微服务新生代之 Nacos
参考https://en.wikipedia.org/wiki/Strategy_pattern
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html#id3
设计模式之禅#第18章 策略模式
Java 8 实战#8.2 使用 Lambda 重构面向对象的设计模式
Java Design Patterns #15. Strategy (Policy) Pattern