策略模式:代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案,即一个类的行为或算法可以在运行时灵活更改
1、Java传统实现:
步骤 1
创建一个接口。
Strategy.java
public interface Strategy { public int doOperation(int num1, int num2); }
步骤 2
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
OperationSubstract.java
public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
OperationMultiply.java
public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
步骤 3
创建 Context 类。
Context.java
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); } }
步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
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)); } }
2、Java8实现:
步骤 1
创建一个接口。
Strategy.java
public interface Strategy { public int doOperation(int num1, int num2); }
步骤 2
创建 Context 类。
Context.java
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); } }
步骤 3
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context((m,n)->m+n); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context((m,n)->m-n); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context((m,n)->m*n); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }