type
status
date
slug
summary
tags
category
icon
password
一、策略模式概述及结构
策略模式最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此,它也可以像模板模式那样,提供框架的扩展点等等。
策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。
策略模式结构:
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
二、策略模式实现
策略定义
策略创建
- 策略模式会包含一组策略,隐藏细节,使用简单工厂 + 单例的结合进行实现
- 若策略类是无状态的,即使用缓存中的策略实现没问题(这样是可以优化分支判断的)
- 静态代码块中的缓存会随着策略的增加而改变,因此还可以利用反射 + 注解 方式进行优化,做到工厂类无需进行修改。
- 若策略类是有状态的,则不能使用缓存起来的策略,需要获取策略时动态创建新的策略(这个仍然需要分支判断,同样也可以通过反射解决)
策略使用
客户端代码一般如何确定使用哪个策略呢?
最常见的是运行时动态确定使用哪种策略,这也是策略模式最典型的应用场景。
运行时动态:指我们事先并不知道会使用哪个策略,而是在程序运行期间,根据配置、用户输入、计算结果等这些不确定因素,动态决定使用哪种策略。
- 作者:ITNXD
- 链接:https://blog.itnxd.eu.org/article/behavioral-patterns-of-strategy-design-patterns
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

