[关闭]
@lzb1096101803 2016-03-06T09:30:50.000000Z 字数 1523 阅读 423

策略模式

Java 面试 设计模式


要会画类图

首先,我们来看下策略模式的概念。一般的解释如下: 
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

一般的,策略模式主要分为以下三个角色:
1. 环境角色(Context):持有一个策略类引用
2. 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。
3. 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。

当存在以下情况时使用Strategy模式
1)• 许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
2)• 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
3)• 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4)• 一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

http://blog.csdn.net/hguisu/article/details/7558249


JDK中的策略模式

java.util.concurrent.ThreadPoolExecutor 线程池类中存在4中预定义的处理程序策略

ThreadPoolExecutor.AbortPolicy 默认策略:处理程序遭到拒绝时将抛出运行时RejectedExecutionException
ThreadPoolExecutor.CallerRunsPolicy:线程调用运行该任务的execute本身,此策略提供简单的反馈控制机制,能减缓新任务的提交速度
ThreadPoolExecutor.DiscardPolicy:不能执行的任务将被删除
ThreadPoolExecutor.DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头的任务将被删除,然后重试执行程序

ThreadPoolExecutor(上下文角色)
RejectedExecutionHandler(抽象策略角色)
AbortPolicy(具体策略)


与状态模式的区别

区别:状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。

状态模式帮助对象管理状态,而策略模式允许Client选择不同的行为。

另一个不那么容易能看出来的区别是:是谁促使了行为的改变。策略模式中,是Client提供了不同的策略给Context;状态模式中,状态转移由Context或State自己管理。另外,如果你在State中管理状态转移,那么它必须持有Context的引用。例如,在VM的例子中,State对象需要调用VM的setState()方法去改变它的状态。另一方面,Strategy从不持有Context的引用,是Client把所选择的Strategy传递给Context。由于状态模式和策略模式的区别,是流行的Java设计原则类面试题之一,我们将会在本文探讨在Java中,状态模式和策略模式的异同,这可以加深你对它们的理解。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注