1.定义
策略模式:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。
同样以计算器的例子来展示策略模式。
2.UML:
3.Code
Operation.class:
abstract class Operation{
public double numberA;
public double numberB;
abstract double getResult();
}
子类:
OperationAdd.class:
class OperationAdd extends Operation{
public double getResult{
return numerA + numberB;
}
}
OperationSub.class:
class OperationSub extends Operation{
public double getResult{
return numerA - numberB;
}
}
OperationMul.class:
class OperationMul extends Operation{
public double getResult{
return numerA * numberB;
}
}
OperationDiv.class:
class OperationDiv extends Operation{
public double getResult{
if(numberB == 0){
throw new Exception("除数不能为0");
}
return numerA / numberB;
}
}
Context.class:
class Context{
private Operation operation;
public Context(Operation opera){
operation = opera;
}
public double getResult(){
return operation.getResult();
}
}
Client.class:
public class Client{
public static void main(String[] args){
String operator = "+";
Operation operation = null;
switch(operator){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
operation.numberA = 2;
operation.numberB = 4;
Context context = new Context(operation);
double result = context.getResult();
}
}
纯粹的策略模式使得客户端还需要处理一大堆的判断,显得很臃肿,可以将策略模式与简单工厂模式结合,将判断的代码移到Context中,如下:
Context.class:
class Context{
private Operation operation;
public Context(String operator,String numberA,String numberB){
switch(operator){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
operation.numberA = numberA;
operation.numberB = numberB;
}
public double getResult(){
return operation.getResult();
}
}
Client.class
public class Client{
public static void main(String[] args){
Context context = new Context("+",2,4);
double result = context.getResult();
}
}
4.总结
可以看到策略模式与简单工厂模式非常非常相似~
策略模式与简单工厂模式的区别:
简单工厂模式:
Operation operation = OperationFactory.create("+",2,4);
double result = operation.getResult();
策略模式:
Context context = new Context("+",2,4);
double result = context.getResult();
策略模式中用户只需要关心Context一个对象即可,简单工厂模式有OperationFactory和Operation两个对象需要用户去了解。
策略模式中Context类不止可以生成对象,而且还暴露出方法可以让客户端直接调用对象的方法,为客户端提供一条龙服务~因此对客户端来说,策略模式的封装性更好。