Strategy(策略) 行为型 对象 1

Intent_意图2

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

Motivation_动机3

对算法进行包装,将使用算法的责任和算法本身分割开,委派给不同的对象管理,使得算法可以在不影响到客户的情况下发生变化

Applicability_适用性4

封装可以互换的行为,并使用委托来决定要使用哪一个

Structure_结构5

Participants_参与者6

  • Strategy(抽象策略) 定义了一个公共接口
  • ConcreteStrategy(具体策略) 实现了抽象策略定义的接口,提供具体的算法实现
  • Context(环境) 持有一个策略类的引用,最终给客户端调用

Collaborations_协作7

  1. Strategy定义一个公共接口,Context使用这个接口调用不同的算法
    ->Strategy一般使用接口或抽象类实现
  2. ConcreteStategy实现Strategy中定义的接口,提供具体的算法实现
  3. Context持有一个Strategy类的引用,通过Strategy提供的公共接口,调用不同的算法

Comsequences_结果8

  • 优点
    算法可自由切换
    扩展性良好
    避免使用多重条件判断
  • 缺点
    策略类数量增多
    所有的策略类都需要对外暴露
  • 用途
    当多个类只在算法或行为上稍有不同时
    算法需要自由切换时
    需要屏蔽算法规则时

Implementation/Sample Code_实现/范例代码910

Implementation

Strategy

public interface Strategy {public void strategyMethod();}

ConcreteStrategy

public class ConcreteStrategyA implements Strategy {public void strategyMethod() {// TODO}}
public class ConcreteStrategyB implements Strategy {public void strategyMethod() {// TODO}}

Context

public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void contextMethod() {strategy.strategyMethod();}}

Sample Code

Strategy

public interface MemberStrategy {public double calcPrice(double price);}

ConcreteStrategy

public class PrimaryMemberStrategy implements MemberStrategy {@Overridepublic double calcPrice(double price) {System.out.println("no discount for Primary Member");return price;}}
public class IntermediateMemberStrategy implements MemberStrategy {@Overridepublic double calcPrice(double price) {System.out.println("10% off for Intermediate Member");return price * 0.9;}}
public class AdvanceMemberStrategy implements MemberStrategy {@Overridepublic double calcPrice(double price) {System.out.println("20% off for Advance Member");return price * 0.8;}
}

Context

public class Price {private MemberStrategy strategy;public Price(MemberStrategy strategy) {this.strategy = strategy;}public double quote(double price) {return strategy.calcPrice(price);}public void setStrategy(MemberStrategy strategy) {this.strategy = strategy;}
}

Client

public class Client {public static void main(String[] args) {MemberStrategy strategy = new PrimaryMemberStrategy();Price price = new Price(strategy);System.out.println("The final price of this item, it's $" + price.quote(100));strategy = new AdanceMemberStrategy();price.setStrategy(stragegy);System.out.println("The final price of this item, it's $" + price.quote(100));}}

Result

The final price of this item, it's $100
The final price of this item, it's $80

Known Uses_已知应用11

Related Patterns_相关模式12


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

Strategy(策略)相关推荐

  1. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  2. 设计模式——Strategy(策略)模式

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...

  3. [设计模式] —— Strategy 策略模式

    文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...

  4. 【设计模式】2.Strategy 策略模式

    Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...

  5. 设计模式之Strategy策略模式

    文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...

  6. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  7. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

  8. Strategy 策略模式

    意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 动机 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法, ...

  9. 步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fami ...

  10. 12种行为模式 之2 STRATEGY 策略模式

    [b]策略模式的组成[/b] 1):抽象策略角色: 通常由一个接口或者抽象类实现. 2):具体策略角色:包装了相关的算法和行为. 3):环境角色:持有一个策略类的引用,最终给客户端(上层模块)调用. ...

最新文章

  1. Android 多渠道打包
  2. Java学习总结:28
  3. 详谈Javascript中的深拷贝和浅拷贝
  4. 浅析企业网站建设潜在价值有哪些?
  5. Zabbix实战之客户端自动注册
  6. UA OPTI570 量子力学29 摄动理论简介
  7. 中国大学mooc慕课python答案_中国大学MOOC(慕课)Python编程基础题目答案
  8. System.Text.Json 中的字符编码
  9. Java观察者模式(Observer模式)
  10. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例...
  11. python基本函数归整
  12. asp + Access 常见的数据库访问失败问题 Microsoft JET Database Engine 错误 '80004005' 解决办法...
  13. 201709-1-打酱油
  14. Kubernetes K8S之Ingress详解与示例
  15. 74cms v5.0.1存在远程连接命令/代码执行漏洞
  16. MySQL——事务机制
  17. 魅族Android7.0刷机包,乐视X900+安卓7.1.2 魅族Flyme6刷机包 最新6.8.3.17R版 紫火20180510更新...
  18. 【NAS】Samba配置文件解析
  19. 基于python的微博热搜爬取及数据分析
  20. 英语不好可以学mysql吗_请你不要坚持自学一直很烂的英语了,好吗?

热门文章

  1. 下方点击出项上方对应的插件_sketch必备插件Craft功能详解(下)
  2. 重读经典:《The Craft of Research(1)》
  3. 我的window10
  4. Oracle 包详解(package)
  5. Java并发编程系列(4)-线程安全及synchronized
  6. 极速FLV合并器——合并FLV文件的好软件
  7. 手把手教你高效快捷的创建Swift Framework
  8. 支付宝即时到帐接口php,支付宝即时到帐接口
  9. 感谢爱测未来,零基础的我的实习期是这么过来的
  10. 移动端隐藏手机虚拟键盘