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

1、定义

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

2、解决的问题

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

3、模式中的角色

1、环境对象(context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。

2、 抽象策略对象(Strategy):它可由接口或抽象类来实现。

3、 具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

4、模式解读

策略模式的类图如下所示

 

 

5JDK涉及到的设计模式

 

ThreadPoolExecutor4中线程池拒绝策略,也可以自定义实现RejectedExecutionHandler进行扩展

AbortPolicy,无法处理任务任务的时候,直接抛出异常,

DiscardPolicy 丢弃当前将要加入队列的任务本身

DiscardOldestPolicy 丢弃任务队列中最旧任务

CallerRunsPolicy 由调用者线程去执行,在任务提交速度过快的情况,可减少任务提交的速度,同时可以保证任务的执行。

6、模式总结

优点:

1、策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。

2、易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。

3、避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。

缺点:

1、维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过5个,就比较令人头疼了。

2、必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。

适用场景

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。