意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
例子:
public interface IStrategy { public int doOperation(int num1, int num2); }
做加法的策略
public class OperationAdd implements IStrategy { @Override public int doOperation(int num1, int num2) { // 做加法 return num1 + num2; } }
做减法策略
public class OperationSubstract implements IStrategy { @Override public int doOperation(int num1, int num2) { // 做减法 return num1 - num2; } }
做乘法策略
public class OperationMultiply implements IStrategy { @Override public int doOperation(int num1, int num2) { // 做乘法 return num1 * num2; } }
创建 Context 类
public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy; } public int excuteStrategy(int num1,int num2) { return strategy.doOperation(num1, num2); } }
使用 Context 来查看当它改变策略 Strategy 时的行为变化
public class StrategyPatternDemo { public static void main(String[] args) { Context context ; context = new Context(new OperationAdd()); System.out.println(context.excuteStrategy(1, 2)); context = new Context(new OperationMultiply()); System.out.println(context.excuteStrategy(1, 2)); context = new Context(new OperationSubstract()); System.out.println(context.excuteStrategy(1, 2)); } }
運行打印:
3
2
-1