定义:
定义了算法家族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化不会影响到使用算法的用户。
可以通过策略模式清除大量的if..else。
适用场景
系统有很多类,而他们的区别仅仅在于他们的行为不同
一个系统需要动态地在几种算法中选择一种
优点:
满足开闭原则
避免使用多重条件转移语句
提高算法的保密性和安全性:只需要知道策略类是干什么的,而不需要知道具体实现
缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类
产生很多策略类
和其他模式的区别:
策略模式和工厂模式:工厂模式是创建型的设计模式,接受指令创建出符合要求的对应对象,而策略模式是行为型的,接受已经创建好的对象,从而实现不同的行为
策略模式和状态模式:策略模式是需要知道要挑选哪一种策略进行处理,而状态模式不需要知道具体的状态,会自动转换
如何消除if-else的判断?
可以通过把判断的逻辑视作为key,结合工厂模式和策略模式进行处理。
源代码:https://github.com/NoSuchClass/design_pattern/tree/master/src/behavioral/strategy
In JDK
interface Comparator<T>
比较器就是一个策略,每个具体的策略都需要实现这个接口下的方法
In Spring
interface Resource
也是一个策略,来进行加载各种不同位置的文件类型,比如常见的ClassPathContextResource
interface InstantiationStrategy
在Spring初始化bean的时候,也使用到了策略模式
这是Spring中InstantiationStrategy的两个实现,这两个实现并不是同级的,还存在策略与策略之间的继承关系