定义:定义一族算法类,将每个算法分别封装起来,让他们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端指使用算法的代码)
起到解耦的作用

策略模式三个步骤:

1. 定义

就是定义一个策略接口和一组实现这个接口的策略类,因为所有的策略接类都实现了相同的接口,所以客户端代码时基于接口而非实现编程,可以灵活替换不同的策略。

2. 创建

因为策略模式会包含一组策略,在使用他们的时候,一般会通过类型(type)来判断创建哪个策略来使用。为了封装创建逻辑,我们需要对客户端屏蔽创建细节,可以将根据type创建策略的逻辑抽取出来,放在工程类中

  1. 如果策略是无状态的,不包含成员变量,只是纯粹的算法实现,则不需要每次调用时都要创建,可以使用查表法,使用静态块将算法缓存好。用的时候直接返回
  2. 相反,如果时有状态的,根据业务场景需要,希望每次从工厂方法中,获取的都是新创建的策略对象,而不是缓存好的对象,则在每次调用时都对其进行实例化操作。

    3. 使用

    根据类型,在运行时动态确定使用哪种策略。避免了if分支判断,其本质时使用了“查表法”

    优化与重构

    如果一个类中有多个策略方法,可以考虑将其拆分成不同的类,提高可读性,使代码内聚
    如果if-else分支判断不复杂,代码不多,则没必要非用策略模式,搞出n多类,反而是一种过度设计

    后记

    设计原则和思想其实比设计模式更加普适和重要,掌握了代码的设计原则和思想,我们甚至可以创造出来新的设计模式