首先,让我们先了解下策略模式的基本概念
策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
在大话设计模式这本书中用的是商场打折的场景,但我在这里用的是和简单工厂模式一样的场景,用以计算器的实现,策略模式可以和简单工厂模式复合使用,这里用同样的场景可以对比两者之间的异同,下面让我们看一下类图关系,这里就会发现,这个类图关系和简单工厂模式的极为相似,不同的是工厂换为了Context。
下面让我们看下实现代码:
客户端调用:
这里我们需要在构造算法环境对象的时候传入算法标识符,而后调用方法即可直接获取结果。
public static void main(String[] args){ AlgorithmContext algorithmContext=new AlgorithmContext("+"); System.out.println(algorithmContext.getResult(1,2)); }
服务端代码:
这是汇总算法判断,与工厂模式不同的是,这里并不会将具体算法返回,而是传给本身的算法基类,由其本身调用具体算法,让客户端可以直接获取结果,而不是返回具体算法,交给客户端处理。
public class AlgorithmContext { OperationAbstract operationAbstract = null; public AlgorithmContext(String signature) { switch (signature) { case "+": operationAbstract = new AddOp(); break; case "-": operationAbstract = new SubtractOpn(); break; case "*": operationAbstract = new MultiplyOp(); break; case "/": operationAbstract = new DivideOp(); break; } } public double getResult(double number1, double number2) { return operationAbstract.accept(number1, number2); } }
这里下面和简单工厂模式方法一样,我仅贴了一个基类和一个实现,别的以此类推
public abstract class OperationAbstract { abstract double accept(double number1,double number2); }
public class AddOp extends OperationAbstract { @Override public double accept(double number1,double number2){ return number1+number2; } }
我们在这里简单对比一下简单工厂模式和策略模式的客户端实现代码:
简单工厂模式:
public static void main(String[] args){ OperationBase operationBase= OperationFactory.createOperation("+"); operationBase.setNumber1(2); operationBase.setNumber2(5); System.out.println(operationBase.getResult()); }
策略模式:
public static void main(String[] args){ AlgorithmContext algorithmContext=new AlgorithmContext("+"); System.out.println(algorithmContext.getResult(1,2)); }可以看出,策略模式对算法的封装的更严谨,简单工厂模式本质上是获取一个具体的实现算法,为其赋值,调用其方法获取结果,而策略模式是获取一个算法家族,由其内部实现算法的分配等工作,结果也是通过算法家族实现的,这里的例子比较简单,相较来说,策略模式使用起来封装性更强。