战略形式

在战略形式(Strategy Pattern)中,一个类的行为或其算法能够在运行时更改。这种类型的规划形式归于行为型形式。

在战略形式中,咱们创立表明各种战略的目标和一个行为跟着战略目标改动而改动的 context 目标。战略目标改动 context 目标的履行算法。

介绍

目的:界说一系列的算法,把它们一个个封装起来, 而且使它们可彼此替换。

首要处理:在有多种算法类似的情况下,运用 if...else 所带来的杂乱和难以保护。

何时运用:一个体系有许多许多类,而差异它们的仅仅他们直接的行为。

怎么处理:将这些算法封装成一个一个的类,恣意地替换。

要害代码:完成同一个接口。

运用实例: 1、诸葛亮的神机妙算,每一个锦囊便是一个战略。 2、游览的出游方法,挑选骑自行车、坐轿车,每一种游览方法都是一个战略。 3、JAVA AWT 中的 LayoutManager。

长处: 1、算法能够自在切换。 2、防止运用多重条件判别。 3、扩展性杰出。

缺陷: 1、战略类会增多。 2、一切战略类都需求对外露出。

运用场景: 1、假如在一个体系里边有许多类,它们之间的差异仅在于它们的行为,那么运用战略形式能够动态地让一个目标在许多行为中挑选一种行为。 2、一个体系需求动态地在几种算法中挑选一种。 3、假如一个目标有许多的行为,假如不必恰当的形式,这些行为就只好运用多重的条件挑选句子来完成。

注意事项:假如一个体系的战略多于四个,就需求考虑运用混合形式,处理战略类胀大的问题。

完成

咱们将创立一个界说活动的 Strategy 接口和完成了 Strategy 接口的实体战略类。Context 是一个运用了某种战略的类。

StrategyPatternDemo,咱们的演示类运用 Context 和战略目标来演示 Context 在它所装备或运用的战略改动时的行为改动。

战略形式的 UML 图

过程 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 时的行为改动。

StatePatternDemo.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));
   }
}

过程 5

验证输出。

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