意图

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

适用性

1. 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2. 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
3. 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4. 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

结构

参与者:
> Strategy(策略) 
— 定义所有支持的算法的公共接口。Context使用这个接口来调用某 ConcreteStrategy定 义的算法。 
> ConcreteStrategy(具体策略) 
— 以Strategy接口实现某具体算法。 
> Context(上下文)?
— 用一个ConcreteStrategy对象来配置。
— 维护一个对Strategy对象的引用。
— 可定义一个接口来让Stategy访问它的数据。

例子

优缺点

> 优点:
* 算法可以自由切换
这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略。  
* 避免使用多重条件判断
如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。   
* 扩展性良好
这甚至都不用说是它的优点,因为它太明显了。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符合了OCP原则。

> 缺点:
* 策略类数量增多
每一个策略都是一个类,复用的可能性很小,类数量增多。   
* 所有的策略类都需要对外暴露
上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违背的,我只是想使用了一个策略,我凭什么就要了解这个策略呢?那要你的封装类还有什么意义?这是原装策略模式的一个缺点,幸运的是,我们可以使用其他模式来修正这个缺陷,如工厂方法模式、代理模式或享元模式。

Strategy Pattern(策略模式)相关推荐

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

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

  2. 【图解设计模式系列】The Strategy Pattern: 策略模式

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为.讲这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句.(大概的意思就是说 我们要多多利用多态 而 ...

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

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

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

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

  5. Strategy Patern 策略模式

    Strategy 模式的意图: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使算法可独立于使用它的客户而变化. 说得太抽象了.下面来看下例子(2007 软件设计师考试--上): ...

  6. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. 设计模式1——策略模式 | 适配器模式 | 工厂模式

    最近在看<Think In JAVA>,其中在讲解继承,组合,抽象类和接口的时候,提到了题中的几个设计模式.这几个设计模式也确实让我更好的理解了JAVA中各个数据结构的含义.今天就结合书本 ...

  8. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  9. 设计模式(六)---- 策略模式

    策略模式(strategy) 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一种算法解决某一问题:同时,可以方便的更换算法或增加新的算法:并且由客户决定调用哪个算法. 1.提出问题 ...

  10. 《设计模式之禅》-策略模式

    策略模式 定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式有三个角色 1.Strategy 抽象策略角色 策略,算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和 ...

最新文章

  1. gis中的擦除_擦除—帮助 | ArcGIS for Desktop
  2. 了解了解一下SQLSERVER里的鬼影记录
  3. MySQL数据库的常用操作
  4. 创意总监分享:我是如何做一款手游地图的
  5. java集合按大小排序_JAVA中对List根据map某个key值从小到大顺序进行排序
  6. git忽略文件或者文件夹
  7. 安卓游戏时禁止状态栏下拉,如何在Android中禁用通知栏下拉菜单?
  8. linux 系统安装mysql (rpm)
  9. [转]Windows Shell 编程 第五章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987939】...
  10. 软媒魔方5.13发布:制作U盘启动,更快速
  11. CSS居中对齐、定位的总结
  12. 9.1 Servlet容器实例
  13. 【MFiX】记录一些有参考价值的legacy-tut/test算例
  14. vue开发银行流水查询系统--基于巨杉数据库
  15. Android 自定义下拉菜单的实现(基于PopupWindow+RecyclerView)
  16. 百分点技术负责人:我们为什么需要大数据操作系统
  17. 【web渗透思路】框架敏感信息泄露(特点、目录、配置)
  18. 华中师大计算机专业陈鹏,考完就放假!这套华师真题,你能拿多少分
  19. 2022-2027年中国网络文学商业化市场竞争态势及行业投资前景预测报告
  20. JavaScript高级程序设计第三版 第3章 基本概念

热门文章

  1. 蚂蚁金服的 Service Mesh 演进之道?
  2. spring boot 异常处理
  3. Android——使用纯java代码实现线性布局(通俗易懂)
  4. Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could n
  5. 怎么切换用户_走进通信:4G手机跟基站是怎么“交流”的
  6. c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)
  7. 上海市经济信息化委关于征集本市2020年拟新建互联网数据中心项目的通知
  8. 网络工程师技能图谱,这些你都会吗?
  9. 轻松智能的数据中心冷却节能方法
  10. idea前进和后退快捷键_必备技能:IDEA一定要懂的32条快捷键