每天一个设计模式 (一)-------- 策略模式

本贴最后更新于 1987 天前,其中的信息可能已经时异事殊

策略模式

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

介绍

意图: 定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换;
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护;
何时使用: 一个系统有许多许多类,任意地替换;
关键代码:实现同一个接口;
应用实例:

  1. 诸葛亮的锦囊妙计,每一个锦囊就是一个策略
  2. 旅游的出行方式,选择骑自行车,坐汽车,每一种旅行方式就是一个策略;
  3. JAVA AWT 中的 LayoutManager
    优点
  4. 算法可以自由切换
  5. 避免多重条件判断
  6. 扩展性良好
    缺点
  7. 策略类会增多
  8. 所有策略类都需要对外暴露;
    使用场景
  9. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一个行为
  10. 一个系统需要动态的在几种算法中选择一个
  11. 一个对象有很多的行为,如果不用恰当的木事,这些行为就只能使用多重条件选择语句来实现
    注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

实现

我们将创建一个定义活动的_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_时的行为变化。

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

步骤 5

执行程序,输出结果:

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

---转载自菜鸟教程

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...