64、策略模式

64、策略模式

00:00
06:24

一个类的行为或其算法可以在运行时更改。他属于行为型模式。
在策略模式中,我们创建表示各种策略的对象 和 一个行为 随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
策略模式的意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
策略模式主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
算法思想:将这些算法封装成一个一个的类,任意地替换。


优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。


使用场景: 
 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
 2、一个系统需要动态地在几种算法中选择一种。
 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
 
下面说下策略模式具体实现
 首先创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。

步骤 1 创建一个接口,接口的名字是Strategy,此接口定义一个方法doOperation,入参是两个整形数据。
public interface Strategy {  public int doOperation(int num1, int num2);}


步骤 2   创建实现接口的实体类。第一实现类是OperationAdd,他实现Strategy接口,我们一听名字就知道,他重写doOperation,是要把两个入参相加
public class OperationAdd implements Strategy{  @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
第二实现类是OperationSubstract,他实现Strategy接口,我们一听名字就知道,他重写doOperation,是要把两个入参相减
public class OperationSubstract implements Strategy
第三实现类是OperationMultiply,他实现Strategy接口,我们一听名字就知道,他重写doOperation,是要把两个入参相乘
public class OperationMultiply implements Strategy

步骤 3  创建 Context 类  Context 是一个使用了某种策略的类 ,他有一个属性Strategy ,并且使用此属性作为一个参数的构造函数,他还有一个方法executeStrategy
内部调用它的属性对象的doOperation方法。

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 时的行为变化。实例就是在Main函数中,有一个Context对象,他的构造函数是new OperationAdd(),
调用它的executeStrategy,传入两个入参数字,他们就实现了相加的功能。




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


以上内容来自专辑
用户评论
  • 听友202724231

    英语发音绝了