- 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。
- 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
- 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
- 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为
- 如何解决:将这些算法封装成一个一个的类,任意地替换。
- 关键代码:实现同一个接口。
- 源码实例:android 动画中的插值器,Recyclerview中LayoutManager
- 优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
- 缺点:
- 策略类会增多。
- 所有策略类都需要对外暴露。
- 使用场景:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
- 角色:
- Strategy(策略):负责决定实现策略所必须的接口
- ConcreteStrategy:负责实现Strategy角色的接口API,即负责实现具体的策略
- Context(上下文):负责使用Strategy角色,Context角色保存了ConcreteStrategy角色的实例,并使用它去实现需求
- 类图:
- 参考:
- 代码: