zoukankan      html  css  js  c++  java
  • 设计模式14 策略模式

    策略模式(Strategy)定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

    策略模式的优点:

    1、多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。

    2、策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。

    3、策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。

    4、策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。

    5、策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

    环境类:

     1 public class Context {
     2     private Strategy strategy;
     3 
     4     public Strategy getStrategy() {
     5         return strategy;
     6     }
     7 
     8     public void setStrategy(Strategy strategy) {
     9         this.strategy = strategy;
    10     }
    11 
    12     public void strategyMethod() {
    13         strategy.strategyMethod();
    14     }
    15 }

    策略类:

     1 public interface Strategy {
     2     public void strategyMethod();
     3 }
     4 
     5 public class ConcreteStrategyA implements Strategy {
     6     @Override
     7     public void strategyMethod() {
     8         // TODO Auto-generated method stub
     9         System.out.println("策略A");
    10     }
    11 }
    12 
    13 public class ConcreteStrategyB implements Strategy {
    14     @Override
    15     public void strategyMethod() {
    16         // TODO Auto-generated method stub
    17         System.out.println("策略B");
    18     }
    19 }

    调用方式:

     1 public class Client {
     2     /*
     3      * 例子:通用类库DBHelper
     4      * 无论连接SQLServer/Oracel/MySql数据库
     5      * 不同的对象,具有相同的使用方式Context
     6      */
     7     public static void main(String[] args) {
     8         //多个类有相似的功能,客户将具体的类传入Context,调用Context统一的方法实现具体功能
     9         Strategy strategy;//扩展点
    10         
    11         //使用策略A
    12         strategy = new ConcreteStrategyA();
    13         
    14         //扩展点(封装了变化点)->切换策略B
    15         //strategy = new ConcreteStrategyB();
    16         
    17         //稳定代码
    18         Context context = new Context();
    19         context.setStrategy(strategy);
    20         context.strategyMethod();
    21     }    
    22 }

    执行结果:

  • 相关阅读:
    wode.
    python中迭代器和生成器。
    Embeded linux 之 UBIFS文件系统
    Windows下Git安装和使用
    套接字 之 windows与linux 差异
    Embeded linux之RTL8188EU/RTL8188ETV使用
    嵌入式Linux之“+”版本问题
    Uboot之net
    Embeded linux之reboot
    Embeded linux之cifs文件系统
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111063.html
Copyright © 2011-2022 走看看