定义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式,让算法的变化,不会影响到使用算法的客户。
策略模式是一种定义一系列算法的方法,从概念上来看,所有的算法都是完成相同的工作,知识实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式的Strategy类层为Context定义了一系列的可供重用的算法或行为。继承有助于读取出这些算法中的公共功能。
策略模式的优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
策略模式还可以用来处理变化的可能性,此处“变化”是指不同场景应用不同业务规则。
策略模式封装了变化。
策略与简单工厂结合:
package o2Strategy;
/**
* Strategy类 运算类 基类
* 属性 a、b 以及getResult方法
*/
public class OperationStrategy {
public Object getResult(double a, double b) {
return null;
}
}
package o2Strategy;
/**
* 子类 加法类
* getResult 具体功能实现
*/
public class Add extends OperationStrategy {
@Override
public Object getResult(double a, double b) {
return a + b;
}
}
package o2Strategy;
/**
* 子类 除法类
* getResult 具体功能实现
*/
public class Div extends OperationStrategy {
@Override
public Object getResult(double a, double b) {
return a / b;
}
}
package o2Strategy;
/**
* 工厂类 创造具体运算类
*/
public class OperateContext {
OperationStrategy os = null;
public OperateContext(String opr) {
switch (opr) {
case "+":
os = new Add();
break;
case "/":
os = new Div();
break;
}
}
public Object getResult(double a, double b) {
return os.getResult(a,b);
}
}
package o2Strategy;
/**
* 调用者 界面
* 只关注结果,不关注具体实现
*/
public class Test {
public static void main(String[] args) {
// 确认算法
OperateContext os = new OperateContext("+");
// 输入参数,得出结果
System.out.println(os.getResult(17.64d,5d));
}
}
简单工厂与策略比较:
简单工厂
public static void main(String[] args) {
Operation op = OperateFactory.getOperation("+");
op.setA(4);
op.setB(6);
System.out.println(op.getResult());//也可以通过方法参数传值
}策略
public static void main(String[] args) {
// 确认算法
OperateContext os = new OperateContext("+");
// 输入参数,得出结果
System.out.println(os.getResult(17.64d,5d));
}可以看出,策略模式把算法父类都隐藏起来了,客户端只需要认识一个OperateContext就可以了,耦合度降低了。
如果要新增一个算法Sub,那么还是要修改OperateContext的switch代码,这是需求变更中不可避免的成本。但是成本是有高低差异的。同样的需求,改动越少越好,方法就是利用反射(抽象工厂模式中也有讲到)。常言道:反射反射,程序员的快乐。(此处引用另一博主的文章)