一、认识策略
还记得静态代理吗?
以下是策略的类图
仔细看一下他们的区别吧,没错我们的代理模式要求代理类和被代理类实现同一个接口,在策略模式中封装角色并不是我们策略的子类。
先总结一下策略的核心类:
1.策略类 2.策略的具体实现类 3.封装角色
二、代码分析
我们就用常举例的,封装一套简易计算器的策略帮大家理解。
/**
* 抽象策略
* @author liyichen
*
*/
public interface IStrategy {
public int cal(int a,int b);
}
/**
* 减法策略
* @author liyichen
*
*/
public class SubStrategy implements IStrategy{
@Override
public int cal(int a, int b) {
return a-b;
}
}
/**
* 加法策略
* @author liyichen
*
*/
public class AddStrategy implements IStrategy {
@Override
public int cal(int a, int b) {
return a+b;
}
}
/**
* 抽象角色 上层都来访问这个类
* @author liyichen
*
*/
public class ContextStrategy {
private IStrategy i;
public ContextStrategy(IStrategy i) {
super();
this.i = i;
}
public int cal(int a ,int b) {
return this.i.cal(a, b);
}
}
public static void main(String[] args) {
//制定策略
IStrategy i = new SubStrategy();
//将策略给抽象角色
ContextStrategy c = new ContextStrategy(i);
//调起方法
System.out.println("1-2="+c.cal(1, 2));
}
OK,很简单的模式就不过多赘述了。
三、总结与思考
策略的优点其实很容易看出来,特别符合OTP原则,要增加其他策略的时候再来一个抽象策略的实现就好,扩展性也很不错。
但是大家有没有注意到,策略模式会导致策略类急剧增多。而且上层的调用者要对所有的具体策略有所感知才可以实现逻辑。所以需要我们在使用策略的时候再混合运用其他模式,例如说工厂方法或者代理等等与策略一起配合使用才能发挥更好的效果。
最后我们来分析策略的使用场景,其实就是当算法需要自由切换的时候。如果一个系统规则你都不知道它可以存在多长时间,那策略绝对是你的好帮手,其次当我们需要屏蔽算法规则场景的时候也可以去使用策略模式。
另外需要注意的是,如果我们具体的策略类的数量超过4个以上的话就要考虑我刚才提到的混合设计模式了,要解决策略的膨胀和外漏的问题,这是对日后维护的负责。
还有,策略注重的是对策略的封装,如果对策略修改的话整个逻辑将会不完整了。这点和命令模式是最大的区别。
OK,以上。有不足之处欢迎指正。