zoukankan      html  css  js  c++  java
  • 策略模式(Strategy )

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

    我下面就自己画类图说明自己心里理解的策略模式。

    场景类中采用策略模式选择不同的算法。

      具体代码实现:

     1 //抽象的策略角色
     2 public interface Strategy {
     3     //策略模式的运算法则
     4     public void doSomething();
     5 }
     6 
     7 //具体策略角色
     8 public class ConcreteStrategy1 implements Strategy {
     9     public void doSomething() {
    10         System.out.println("具体策略1的运算法则");
    11     }
    12 }
    13 public class ConcreteStrategy2 implements Strategy {
    14     public void doSomething() {
    15         System.out.println("具体策略2的运算法则");
    16     }
    17 }
    18 
    19 //封装场景类
    20 public class Context {
    21     //抽象策略
    22     private Strategy strategy = null;
    23     //设置具体策略
    24     public setStrategy(Strategy strategy){
    25         this.strategy = strategy;
    26     }
    27     //封装后的策略方法
    28     public void doAnythinig(){
    29         this.strategy.doSomething();
    30     }
    31 }
    32 
    33 //场景类
    34 public class Client extends Context {
    35     public static void main(String[] args) {
    36         //一个具体的策略
    37         Strategy strategy = new ConcreteStrategy1();
    39         new Client().setStrategy(strategy);
    40         //执行封装后的方法
    41         context.doAnythinig();
    42     }
    43 }

    大致的执行代码就就是这样,具体实现细节还要完善。

    总结:

    首先,算法可以自由切换。这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封
    装角色对其进行封装,保证对外提供“可自由切换”的策略。

    其次,避免使用多重条件判断。如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要
    使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

    最后,扩展性良好。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件。

     

  • 相关阅读:
    Mapjoin和Reducejoin案例
    自定义InputFormat和OutputFormat案例
    shullfe机制详解
    辅助排序和Mapreduce整体流程
    Mapreduce的排序(全局排序、分区加排序、Combiner优化)
    Mapreduce中maptask过程详解
    Mapreduce的序列化和流量统计程序开发
    SpringCloud-熔断器
    Mybatis 之$与#
    限流算法
  • 原文地址:https://www.cnblogs.com/xubiao/p/5467610.html
Copyright © 2011-2022 走看看