第一梦 策略模式
Posted yrml
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一梦 策略模式相关的知识,希望对你有一定的参考价值。
写在之前
这篇博客是自己开始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下)
以上是关于第一梦 策略模式的主要内容,如果未能解决你的问题,请参考以下文章