一.什么是策略模式

策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。

再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。

策略模式(Strategy): 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。

二.使用策略模式消除if…else


1. if…else形式

  1. public static void operation(int x,int y,String type){
  2. if("add".equals(type)){//加
  3. System.out.println(x + y);
  4. }else if("substract".equals(type)){//减
  5. System.out.println(x - y);
  6. }else if("multiply".equals(type)){//乘
  7. System.out.println(x * y);
  8. }else if("divide".equals(type)){//除
  9. System.out.println(x / y);
  10. }
  11. }

策略模式 - 图1

2. 策略模式形式

  1. public static void main(String[] args) {
  2. OperationContext operationContext = new OperationContext(new OperationAdd());
  3. System.out.println("加:"+operationContext.handle(2, 1));
  4. operationContext = new OperationContext(new OperationSubstract());
  5. System.out.println("减:"+operationContext.handle(2, 1));
  6. operationContext = new OperationContext(new OperationMultiply());
  7. System.out.println("乘:"+operationContext.handle(2, 1));
  8. operationContext = new OperationContext(new OperationDivide());
  9. System.out.println("除:"+operationContext.handle(2, 1));
  10. }
  • 实现策略模式步骤:

    • 1.创建一个接口

      1. public interface OperationStrategy {
      2. int operation(int x,int y);
      3. }
    • 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; } }

  1. - **3.创建策略上下文 OperationContext**
  2. ```java
  3. public class OperationContext {
  4. private OperationStrategy operationStrategy;
  5. public OperationContext(OperationStrategy operationStrategy){
  6. this.operationStrategy = operationStrategy;
  7. }
  8. public int handle(int num1, int num2){
  9. return operationStrategy.operation(num1, num2);
  10. }
  11. }