策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
组成: Strategy(抽象策略类): 1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。 ConcreteStrategy(具体策略类): 2、 实现了Strategy定义的接口,提供具体的算法实现。 Context(应用场景) : 1、需要使用ConcreteStrategy提供的算法。 2、 内部维护一个Strategy的实例。 3、 负责动态设置运行时Strategy具体的实现算法。 4、负责跟Strategy之间的交互和数据传递。
创建一个接口:
public interface Strategy { public int doOperation(int num1, int num2); }创建实现接口的实体类:
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } } public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } } public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }创建 Context 类:
public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } }使用 Context 来查看当它改变策略 Strategy 时的变化:
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }输出;
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50