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