第一梦 策略模式

写在之前

这篇博客是自己开始Java设计模式系统学习之路记录,以前学习都是零零散散的,很多东西都是不常用就慢慢忘记了 。为了跳出怪圈,也对学习过的知识整理成册,避免反复学习,让我们开始吧!

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

什么是策略模式

策略模式是指对一系列的算法定义,并将每一个算法封装起来,让算法可以独立于使用它的客户而变化。说这么多高端的专业术语,其实通俗的将,就是通过高内聚解耦外部访问

代码实战

  • 首先定义一个策略接口,并抽象出策略的执行方法
     1 /**
     2  * 首先定义一个策略接口
     3  * @author zhaohui.tan
     4  * @date 2018-05-16
     5  */
     6 public interface IStrategy {
     7 
     8   /**
     9    * 抽象出策略执行方法
    10    */
    11   void execute();
    12 
    13 }
  • 通过实现接口来实现不同策略的具体实现,也就是之前说的算法定义(这里定义三个实现类)
    1 public class Singing implements IStrategy {
    2 
    3     @Override
    4     public void execute() {
    5         System.out.println("白月光,心里某个地方...");
    6     }
    7 }
    1 public class BasketBall implements IStrategy {
    2 
    3     @Override
    4     public void execute() {
    5         System.out.println("转身一个完美三分球...");
    6     }
    7 }
    1 public class Trip implements IStrategy {
    2 
    3     @Override
    4     public void execute() {
    5         System.out.println("世界辣么大,我想出去开开眼界...");
    6     }
    7 }
  • 定义一个容器来存放各个算法定义(策略)
     1 /**
     2  * 存放策略的容器
     3  * @author zhaohui.tan
     4  * @date 2018-05-16
     5  */
     6 public class Context {
     7 
     8     private IStrategy strategy;
     9 
    10     public Context(final IStrategy strategy) {
    11         this.strategy = strategy;
    12     }
    13 
    14     /**
    15      * 执行策略
    16      */
    17     public void operation(){
    18         this.strategy.execute();
    19     }
    20 
    21 }
  • 通过执行者执行不同的策略
     1 import com.yrml.strategy.context.Context;
     2 import com.yrml.strategy.strategy.impl.BasketBall;
     3 import com.yrml.strategy.strategy.impl.Singing;
     4 import com.yrml.strategy.strategy.impl.Trip;
     5 
     6 /**
     7  * 策略执行者
     8  * 策略模式的好处:体现了高内聚低耦合的特性
     9  * @author zhaohui.tan
    10  * @date 2018-05-16
    11  */
    12 public class Executor {
    13 
    14     public static void main(String[] args) {
    15         Context context;
    16         System.out.println(">>>>>>>>>>>心血来潮想唱歌<<<<<<<<<<<");
    17         context = new Context(new Singing());
    18         context.operation();
    19         System.out.println("\n");
    20 
    21         System.out.println("-----------被詹姆斯刺激了-----------");
    22         context = new Context(new BasketBall());
    23         context.operation();
    24         System.out.println("\n");
    25 
    26         System.out.println("===============裸辞=================");
    27         context = new Context(new Trip());
    28         context.operation();
    29         System.out.println("\n");
    30     }
    31 
    32 }
  • 实例输出结果
     1 >>>>>>>>>>>心血来潮想唱歌<<<<<<<<<<<
     2 白月光,心里某个地方...
     3 
     4 -----------被詹姆斯刺激了-----------
     5 转身一个完美三分球...
     6 
     7 ===============裸辞=================
     8 世界辣么大,我想出去开开眼界...

代码托管

该实例代码托管在我的GitHub上,想偷懒的小伙伴可以直接检出运行,也可做一个参考

优点

充分体现高内聚低耦合特性,可拓展(完美遵守OCP原则),增加不同的实现类,只需修改存放容器Context即可

缺点

  • 客户端必须知道所有的策略实现类,并且自行决定使用哪一个
  • 造成很多的类,因为每一个实现类都是一个新类(对于该条网上说可以通过享元模式来减少对象的数量,有兴趣的同学可以自行google下)

猜你喜欢

转载自www.cnblogs.com/yrml/p/9048992.html
今日推荐