设计模式之策略模式Strategy

字数 420阅读 40

策略模式(Strategy Pattern)

一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

优缺点

优点:

1.算法可以自由切换 
2.避免使用多重条件判断 
3.扩展性良好。

缺点:

1.策略类会增多 
2.所有策略类都需要对外暴露

应用场景

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。我们可以将这些算法封装成一个一个的类,实现同一个接口,任意地替换。策略模式主要解决在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

实现

以算数加减乘除为例,定义符号操作接口策略,不同符号不同的算法,使用策略模式实现策略接口。然后定义使用策略的上下文对象 Context,将需要执行的策略传递给Context即可

strategy

定义统一的策略接口

Strategy.java
public interface Strategy {
   public int doOperation(int num1, int num2);
}

具体的策略实现类

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;
   }
}

创建使用策略的 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);
   }
}

使用 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));
   }
}

验证输出

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

码字不易,感谢阅读

推荐阅读更多精彩内容