定义:

定义了算法家族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化不会影响到使用算法的用户。

可以通过策略模式清除大量的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的两个实现,这两个实现并不是同级的,还存在策略与策略之间的继承关系