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策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

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

     

  • 相关阅读:
    1833: [ZJOI2010]count 数字计数——数位dp
    【模板】BZOJ 3685: 普通van Emde Boas树——Treap
    【模板】解决二分图匹配的强力算法——Hopcroft-Karp算法
    BZOJ 4516: [Sdoi2016]生成魔咒——后缀数组、并查集
    【模板】二分图匹配/一般图匹配——匈牙利算法/随机匈牙利算法
    【模板】BZOJ 1692:队列变换—后缀数组 Suffix Array
    BZOJ 4241: 历史研究——莫队 二叉堆
    【模板】BZOJ 3781: 小B的询问 莫队算法
    BZOJ 3656: 异或 (组合数取模 CRT)
    【模板】SPOJ FACT0 大数分解 miller-rabin & pollard-rho
  • 原文地址:https://www.cnblogs.com/xubiao/p/5467610.html
Copyright © 2011-2022 走看看