Strategy(策略)
Strategy(策略) 行为型 对象 1
Intent_意图2
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
Motivation_动机3
对算法进行包装,将使用算法的责任和算法本身分割开,委派给不同的对象管理,使得算法可以在不影响到客户的情况下发生变化
Applicability_适用性4
封装可以互换的行为,并使用委托来决定要使用哪一个
Structure_结构5
Participants_参与者6
- Strategy(抽象策略) 定义了一个公共接口
- ConcreteStrategy(具体策略) 实现了抽象策略定义的接口,提供具体的算法实现
- Context(环境) 持有一个策略类的引用,最终给客户端调用
Collaborations_协作7
- Strategy定义一个公共接口,Context使用这个接口调用不同的算法
->Strategy一般使用接口或抽象类实现 - ConcreteStategy实现Strategy中定义的接口,提供具体的算法实现
- 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
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎
Strategy(策略)相关推荐
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...
- 设计模式——Strategy(策略)模式
目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...
- [设计模式] —— Strategy 策略模式
文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...
- 【设计模式】2.Strategy 策略模式
Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...
- 设计模式之Strategy策略模式
文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...
- Strategy策略模式
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...
- 设计模式学习笔记--Strategy 策略模式
所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...
- Strategy 策略模式
意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 动机 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法, ...
- 步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fami ...
- 12种行为模式 之2 STRATEGY 策略模式
[b]策略模式的组成[/b] 1):抽象策略角色: 通常由一个接口或者抽象类实现. 2):具体策略角色:包装了相关的算法和行为. 3):环境角色:持有一个策略类的引用,最终给客户端(上层模块)调用. ...
最新文章
- Android 多渠道打包
- Java学习总结:28
- 详谈Javascript中的深拷贝和浅拷贝
- 浅析企业网站建设潜在价值有哪些?
- Zabbix实战之客户端自动注册
- UA OPTI570 量子力学29 摄动理论简介
- 中国大学mooc慕课python答案_中国大学MOOC(慕课)Python编程基础题目答案
- System.Text.Json 中的字符编码
- Java观察者模式(Observer模式)
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例...
- python基本函数归整
- asp + Access 常见的数据库访问失败问题 Microsoft JET Database Engine 错误 '80004005' 解决办法...
- 201709-1-打酱油
- Kubernetes K8S之Ingress详解与示例
- 74cms v5.0.1存在远程连接命令/代码执行漏洞
- MySQL——事务机制
- 魅族Android7.0刷机包,乐视X900+安卓7.1.2 魅族Flyme6刷机包 最新6.8.3.17R版 紫火20180510更新...
- 【NAS】Samba配置文件解析
- 基于python的微博热搜爬取及数据分析
- 英语不好可以学mysql吗_请你不要坚持自学一直很烂的英语了,好吗?