一.什么是策略模式
策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
策略模式(Strategy): 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
二.使用策略模式消除if…else
1. if…else形式
public static void operation(int x,int y,String type){if("add".equals(type)){//加System.out.println(x + y);}else if("substract".equals(type)){//减System.out.println(x - y);}else if("multiply".equals(type)){//乘System.out.println(x * y);}else if("divide".equals(type)){//除System.out.println(x / y);}}

2. 策略模式形式
public static void main(String[] args) {OperationContext operationContext = new OperationContext(new OperationAdd());System.out.println("加:"+operationContext.handle(2, 1));operationContext = new OperationContext(new OperationSubstract());System.out.println("减:"+operationContext.handle(2, 1));operationContext = new OperationContext(new OperationMultiply());System.out.println("乘:"+operationContext.handle(2, 1));operationContext = new OperationContext(new OperationDivide());System.out.println("除:"+operationContext.handle(2, 1));}
实现策略模式步骤:
1.创建一个接口
public interface OperationStrategy {int operation(int x,int y);}
2.各种策略实现 ```java //加 public class OperationAdd implements OperationStrategy { @Override public int operation(int x, int y) { return x+y; } }
//减 public class OperationSubstract implements OperationStrategy { @Override public int operation(int x, int y) { return x-y; } }
//乘 public class OperationMultiply implements OperationStrategy { @Override public int operation(int x, int y) { return x*y; } }
//除 public class OperationDivide implements OperationStrategy { @Override public int operation(int x, int y) { return x/y; } }
- **3.创建策略上下文 OperationContext**```javapublic class OperationContext {private OperationStrategy operationStrategy;public OperationContext(OperationStrategy operationStrategy){this.operationStrategy = operationStrategy;}public int handle(int num1, int num2){return operationStrategy.operation(num1, num2);}}
