策略模式详解(定义角色及应用实例)

策略模式详解(定义角色及应用实例)-mikechen

策略模式是属于设计模式中的行为模式中的一种,策略模式主要解决选项过多的问题,避免大量的if else 和 switch下有太多的case。

策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性@mikechen

策略模式的定义

策略(Strategy)模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

策略是个形象的表述,所谓策略就是方案,日常生活中,要实现目标,有很多方案,每一个方案都被称之为一个策略

打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。

再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。

在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径,这就是策略模式。

策略模式的结构

策略模式详解(定义角色及应用实例)-mikechen
这个模式涉及到三个角色:

1.环境(Context)角色

持有一个策略类的引用,提供给客户端使用。

2.抽象策略(Strategy)角色

这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。

3.具体策略(ConcreteStrategy)角色

实现了抽象策略定义的接口,包装了具体的算法或行为。

策略模式的实现

策略模式详解(定义角色及应用实例)-mikechen

1.创建抽象策略类

  1. package com.mikechen.java.design.strategy;
  2.  
  3.  
  4.  
  5.  
  6. /**
  7. * 抽象策略类
  8. *
  9. * @author mikechen
  10. */
  11. public interface Strategy {
  12.     /**
  13.      * 策略方法
  14.      */
  15.     public void strategyInterface();
  16. }

2.创建具体策略

1)具体策略A

  1. package com.mikechen.java.design.strategy;
  2.  
  3.  
  4.  
  5.  
  6. /**
  7. * 具体策略A
  8. *
  9. * @author mikechen
  10. */
  11. public class ConcreteStrategyA  implements Strategy {
  12.     @Override
  13.     public void strategyInterface() {
  14.         System.out.println("执行策略A");
  15.     }
  16. }

2)具体策略B

  1. package com.mikechen.java.design.strategy;
  2.  
  3.  
  4.  
  5.  
  6. /**
  7. * 具体策略B
  8. *
  9. * @author mikechen
  10. */
  11. public class ConcreteStrategyB implements Strategy {
  12.     @Override
  13.     public void strategyInterface() {
  14.         System.out.println("执行策略B");
  15.     }
  16. }

 

3.创建环境类

  1. package com.mikechen.java.design.strategy;
  2.  
  3.  
  4.  
  5.  
  6. /**
  7. * 环境类
  8. *
  9. * @author mikechen
  10. */
  11. public class Context {
  12.     //持有一个具体策略的对象
  13.     private Strategy strategy;
  14.  
  15.  
  16.  
  17.  
  18.     /**
  19.      * 构造函数,传入一个具体策略对象
  20.      * @param strategy    具体策略对象
  21.      */
  22.     public Context(Strategy strategy){
  23.         this.strategy = strategy;
  24.     }
  25.     
  26.     /**
  27.      * 策略方法
  28.      */
  29.     public void contextInterface(){
  30.  
  31.  
  32.  
  33.  
  34.         strategy.strategyInterface();
  35.     }
  36. }

 

策略模式的优缺

策略模式详解(定义角色及应用实例)-mikechen

1.优点

  • 算法可以自由切换
  • 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
  • 扩展性良好,增加一个策略只需实现接口即可

2.缺点

  • 策略类数量会增多,每个策略都是一个类,复用的可能性很小
  • 所有的策略类都需要对外暴露

 

策略模式的应用场景

策略模式详解(定义角色及应用实例)-mikechen

  • 多个类只有算法或行为上稍有不同的场景
  • 算法需要自由切换的场景
  • 需要屏蔽算法规则的场景
  • 出行方式,自行车、汽车等,每一种出行方式都是一个策略
  • 商场促销方式,打折、满减等
评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!