1、定义
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2、解决的问题
可以动态的改变对象的行为。
3、模式中的角色
1、环境对象(context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
2、抽象策略对象(Strategy):它可由接口或抽象类来实现。
3、具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
4、模式解读
策略模式的类图如下所示
5、JDK 涉及到的设计模式
ThreadPoolExecutor 的 4 中线程池拒绝策略,也可以自定义实现 RejectedExecutionHandler 进行扩展
AbortPolicy,无法处理任务任务的时候,直接抛出异常,
DiscardPolicy 丢弃当前将要加入队列的任务本身
DiscardOldestPolicy 丢弃任务队列中最旧任务
CallerRunsPolicy 由调用者线程去执行,在任务提交速度过快的情况,可减少任务提交的速度,同时可以保证任务的执行。
6、模式总结
优点
1、策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。
2、易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。
3、避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。
缺点
1、维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过 5 个,就比较令人头疼了。
2、必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。
适用场景
1、多个类只区别在表现行为不同,可以使用 Strategy 模式,在运行时动态选择具体要执行的行为。
2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。