上一节我们简单讨论了简单工厂模式,现在我们来看看另外一张设计模式-策略模式,所谓策略模式,就是封装策略,这个策略可以是算法,业务流程等等,只要是类似的东西都可以封装成策略。
我们把上一节的简单工厂修改一下,修改成策略模式
增加一个计算器的类
public class Calculator {
private Operation oper;
public Calculator(Operation oper){
this.oper = oper;
}
public double getResult(){
return oper.getResult();
}
}
测试类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calculator calculator = new Calculator(new Add(30,20));
System.out.println(calculator.getResult());
}
}
我们分析一下,简单工厂和策略模式的异同,简单工厂模式,我们必须开放Operation,OperatorFactory,但是在策略模式中,我们只要开放Calculator类(Add可以替换掉)就可以了,其他的策略都可以封闭。
单一的策略模式还是太复杂了(具体策略需要开放,比如add等),我们看看结合简单工厂模式和策略模式会发生什么有趣的现象。
修改一下Calculator为CalculatorFactory
public class CalculatorFactory {
private Operation oper;
public CalculatorFactory(String operate,double firstNumber,double secondNumber){
switch(operate){
case "+": oper = new Add(firstNumber,secondNumber);break;
case "-": oper = new Sub(firstNumber,secondNumber);break;
case "*": oper = new Mul(firstNumber,secondNumber);break;
case "/": oper = new Div(firstNumber,secondNumber);break;
}
}
public double getResult(){
return oper.getResult();
}
}
测试类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Calculator calculator = new Calculator(new Add(30,20));
CalculatorFactory calculator = new CalculatorFactory("+",30,20);
System.out.println(calculator.getResult());
}
}
总结:简单工厂+策略模式,对外(调用者)只要一个类就能搞定一切,降低了耦合性。代码更加简洁,这种方式是最常见的方式,只要是关于算法和规则多样性的设计,都可以采用这种方式实现,如果你觉得代码很臃肿,耦合程度很高,不妨小试一下这种方式。不过我觉得swith和if在代码中太碍眼,接下来的讨论中,我们将把swith或者if分支去掉,让代码变得更简洁,美观。