策略模式属于对象的行为模式。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式相当于可插入式的算法。
当准备在一个系统里使用策略模式时,首先必须找到需要包装的算法,看看算法是否可以从环境中分割开来,
最后在考察这些算法是否会在以后发生变化。
这个模式涉及三个角色:
源代码:
环境类
public class Context { private Strategy strategy; //策略方法 public void contextInterface(){ strategy.strategyInterface(); } }
抽象策略类
public abstract class Strategy { //策略方法 public abstract void strategyInterface(); }
具体策略类
public class ConcreteStrategy extends Strategy { //策略模式 @Override public void strategyInterface() { //write your algorithm code here } }
这里给出的仅仅是策略模式的最小实现,因此具体策略角色才只有一个。
一般而言,有意义的策略模式的应用都会涉及到多于一个的具体策略角色。
策略模式实现要注意的地方:
1. 经常见到的是,所有具体的策略类都有一些公关的方法。这时候,就应当把这些公关的行为放到共同的抽象角色Strategy类里面。当然这时候抽象策略角色必须要用java抽象类实现,而不能是java接口。
2. 策略模式在每一个时刻都只能使用一个策略对象,但是有的时候一个应用程序同时和几个策略对象相联系。
也就是说,在应用程序启动时,所有的策略对象就已经被创立出来,而应用程序可以在几个策略对象之间调换。
AWT中的LayoutManager
java.awt类库需要在运行期间动态的由客户端决定一个Container对象怎样排列它所有的GUI构件。
Java语言提供了几种不同的排序方式,包装在不同的类里:
LayoutManager的类图:
假设要设计一个排序系统,动态的决定采用二元排序(Binary Sort)、泡沫排序(Bubble Sort)、堆栈排序(Heap Sort)、
快速排序(Quick Sort)、基数排序(Radix Sort)。
显然,采用策略模式把几种排序算法包装到不同的算法类里面,让所有的算法类具有相同的接口,就是一个很好的设计。
排序策略系统的设计如下:
客户端必须决定在何时使用哪一个排序算法,也就是所,这个决定不是在模式内部决定的。
另外,策略模式不适合于处理同事嵌套多于一个算法的情形。
一般而言,策略模式只适用于客户端在几种算法中选择一种的情形,并不适用于客户端同时需要几种算法的情形。
例如,算法四,在所有的折扣算法计算后,总的折扣数不能超过1000.
这就意味着客户端必须首先适用折扣算法一、二、三计算出折扣总值后,再使用算法四。
这种重复使用多种算法的情形不是单纯的策略模式可以处理的,需要进一步使用装饰模式。
优点:
缺点:
原文:https://www.cnblogs.com/Vincent-yuan/p/13568678.html