当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。讲这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。(大概的意思就是说 我们要多多利用多态 而不是用大量的if else语句)
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式进行处理这种变化的可能性。
说了一堆P话。
简而言之 就是:
简单理解就是一组算法,可以互换,再简单点策略就是封装算法。

但是这也太精简了,究竟是什么意思呢?

看上去很乱 是不是?

下面分析一下这个模式包含哪些角色:
**环境(Context)**角色:持有一个Strategy的引用。
**抽象策略(Strategy)**角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
**具体策略(Concrete Strategy)**角色:包装了相关的算法或行为。

实例

假设某人在开车时频繁加速,因为超速他被一个警察拦下来了。有可能这个警察会比较友好,没开任何罚单就让他把车开走了。也有可能遇到了一个不太友好的警察,然后这个警察给他出具了一张罚单。但是并不知道会遇到什么类型的警察,直到他因为超速而被警察拦下停车,实际上这就是一种程序当中“运行时”的概念,只有在运行的时候才知道,到底会遇到什么类型的警察,实际上这就是“策略模式”。

//先来定义一个策略的接口:Strategy
public interface Strategy {public void processSpeeding(int speed);
}
两种不同类型的Strategy:
public class NicePolice implements Strategy {@Overridepublic void processSpeeding(int speed) {System.out.println("This is your first time, be sure don't do it again!");}}public class HardPolice implements Strategy {@Overridepublic void processSpeeding(int speed) {System.out.println("Your speed is " + speed+ ", and should get a ticket!");}}
定义需要依赖警察来处理超速问题的场景
public class Situation {private Strategy strategy;public Situation(Strategy strategy){this.strategy = strategy;}public void handleByPolice(int speed){this.strategy.processSpeeding(speed);}}
public class Main {public static void main(String[] args) {HardPolice hardpolice = new HardPolice();NicePolice nicepolice = new NicePolice();// In situation 1, a hard officer is met// In situation 2, a nice officer is metSituation s1 = new Situation(hardpolice);Situation s2 = new Situation(nidepolice);// the result based on the kind of police officer.s1.handleByPolice(10);s2.handleByPolice(10);}}

实例中实例

JDK中的策略模式
在创建线程池(ThreadPoolExecutor)时,需要传入拒绝策略,当创建新线程使当前运行的线程数超过maximumPoolSize时,将会使用传入的拒绝策略进行处理。

  • AbortPolicy:直接抛出异常。
  • CallerRunsPolicy:只用调用者所在线程来运行任务。
  • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
  • DiscardPolicy:不处理,丢弃掉。

这里使用的就是策略模式。

优缺点

优点:

  • 算法可以自由切换:改一下策略很方便
  • 扩展性良好:增加一个策略,就多增加一个类就好了。

缺点:

  • 策略类的数量增多:每一个策略都是一个类,复用的可能性很小、类数量增多
  • 所有的策略类都需要对外暴露:上层模块必须知道有哪些策略,然后才能决定使用哪一个策略

策略模式-Strategy

【图解设计模式系列】The Strategy Pattern: 策略模式相关推荐

  1. 进阶学习(3.14) Strategy Pattern 策略模式

    1, 什么是策略模式 1.1  未达到预期目的的各种应对方案 1.2  程序代码中的每一个分支都可以称之为策略, 而策略模式,则是将行为划分到具体类, 使用类对象区分行为 2, 优缺点 2.1  减少 ...

  2. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  3. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

  4. 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

    概述: 每个人都要"交个人所得税",但是"在美国交个人所得税"和"在中国交个人所得税"就有不同的算税方法. 而策略模式就是对算法进行包装,是 ...

  5. 设计模式之Strategy(策略模式系列1)

    看了Jdon上写的的策略模式,例子很简单,代码有些错误.http://www.jdon.com/designpatterns/ 文章写的比较早,其实现在的策略模式大多是用Enum来实现,会简单的多,但 ...

  6. 【设计模式】设计模式C++编程实现之策略模式(Strategy Pattern)

    在介绍具体的设计模式之前,先介绍一下OO(Objected-Oreinted)基础以及OO原则. OO基础:抽象.封面装.多态.继承. OO原则: 封装变化. 多用组合,少用继承. 针对接口编程,不针 ...

  7. C++设计模式-使用Qt框架模拟策略模式(Strategy)+简单工厂实现商场促销

    商城促销: 1.简单工厂模式:客户端认识两个类,CashSuper与CashFactory 2.简单工厂模式 + 策略模式:客户端只要认识CashContext就可以了,更加降低耦合性 策略模式解析: ...

  8. C++设计模式之Strategy(策略模式)

    在介绍策略模式之前,我们先来看看多态性.多态性很好理解,策略模式就是在多态性的基础上进行修改. 1.首先定义个父类,定义了所有的函数接口,但不去实现它. 假设父类名为CStrategy,这里设计为抽象 ...

  9. 【设计模式】行为型01策略模式(strategy patten)

    学设计模式一段时间了,有些懂了,有些半知半解,通过写笔记博客的方式总结一下: 关于策略模式,我的个人理解就是将一些经常变动的算法独立抽取出来,可以是一个方法,也可以是一个策略类,这样,如果有需求变更, ...

最新文章

  1. DevOps之旅:运维人员阅读源代码的实用技巧
  2. make--变量与函数的综合示例 自动生成依赖关系
  3. PlanAhead 与时序分析
  4. excel可编码java,Java关于前后台传输中文乱码以及Excel下载乱码解决
  5. 多线程内存泄漏_内存泄漏的场景和解决办法
  6. 网站301重定向 解决方法
  7. 用十条命令在一分钟内检查Linux服务器性能
  8. mysql分组之后统计数量
  9. 深度学习应用:入门篇(下)
  10. Qt QPainter绘图
  11. FontForge 修改,删除,设计字体
  12. 一次大文件上传失败的排查
  13. 独家丨DeepMind科学家、AlphaTensor一作解读背后的故事与实现细节
  14. 计算机毕业设计php+vue基于微信小程序的叽喳音乐播放小程序
  15. 星速配资:煤炭概念股大幅拉升 看好投资机会
  16. 如何区分一个股票属于哪个证券交易所的,如何区分一个股票是上证指数还是深圳指数?
  17. 正版方舟建服务器,方块方舟怎么自建服务器 自建服务器方法详解
  18. 基于单片机声音分贝采集和显示控制系统设计(毕业设计资料)
  19. 计算机怎么删除共享地址,取消共享文件夹_怎么清理所有共享文件夹
  20. oracle instantclient(即时客户端安装) 中文乱码

热门文章

  1. 爬虫:pyquery 解析库
  2. SQL SERVER 创建计算列
  3. 微信公众号线上和线下增粉秘籍:
  4. ABAQUS学习(1):打开求解好的cae文件并查看云图
  5. 【React】1课 react框架小白入门使用教程
  6. Python基于TensorFlow深度学习卷积神经网络自动识别网站验证码设计
  7. Navicat运行sql文件导入数据库失败出错
  8. 28个在线学习网站让你变身齐天大圣!
  9. java do while 跳出循环_while(true)何时跳出循环?
  10. 动态规划经典题目——数塔问题