JDK设计模式(十二)策略模式

1、定义

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2、解决的问题

可以动态的改变对象的行为。

3、模式中的角色

1、环境对象(context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
2、抽象策略对象(Strategy):它可由接口或抽象类来实现。
3、具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

4、模式解读

策略模式的类图如下所示
image.png

5、JDK 涉及到的设计模式

image.png
ThreadPoolExecutor 的 4 中线程池拒绝策略,也可以自定义实现 RejectedExecutionHandler 进行扩展
AbortPolicy,无法处理任务任务的时候,直接抛出异常,
DiscardPolicy 丢弃当前将要加入队列的任务本身
DiscardOldestPolicy 丢弃任务队列中最旧任务
CallerRunsPolicy 由调用者线程去执行,在任务提交速度过快的情况,可减少任务提交的速度,同时可以保证任务的执行。

6、模式总结

优点

1、策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。
2、易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。
3、避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。

缺点

1、维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过 5 个,就比较令人头疼了。
2、必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。

适用场景

1、多个类只区别在表现行为不同,可以使用 Strategy 模式,在运行时动态选择具体要执行的行为。
2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

https://alicharles.oss-cn-hangzhou.aliyuncs.com/static/images/mp_qrcode.jpg
文章目录
  1. 1、定义
  2. 2、解决的问题
  3. 3、模式中的角色
  4. 4、模式解读
  5. 5、JDK 涉及到的设计模式
  6. 6、模式总结
    1. 优点
    2. 缺点
    3. 适用场景