策略模式/Strategy
策略模式/Strategy
意图/适用场景:
策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以互换。这样做的好处是,客户端可以以插件的方式更换算法。
电子商务网站的购物车系统是一个策略模式非常适用的场景:比如,在优惠方式上,某一类商品是每件优惠一元,另一类商品是折扣5%,还有一类商品也是打折,但折扣幅度是10%。所以需要应用不同的优惠算法来计算最终的价格。
在这个系统中,可以想象到会有一个计算者角色(与本模式中的Context相同功能),它负责计算价格。但如果把所有的算法都放在它里面来实现的话,会比较混乱。如果应用策略模式的话,就可以把行为和上下文环境分开。上下文类(计算者)中负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响到上下文和客户端。这也为上下文类减轻了负担。
UML:
参与者:
- 上下文角色(Context):持有一个Strategy类的引用。
- 抽象策略角色(Strategy):抽象角色,通常是一个接口或者抽象类。定义出所有的具体策略类的公共接口。如果具体策略类有共同的行为,可以把Strategy定义为抽象类,并实现这些公共的行为;否则最好定义为接口。
- 具体策略(ConcreteStrategy):包装了相关的算法或行为。
要点:
在下面的情况下应当考虑使用策略模式:
- 系统需要动态地在多种算法中选择一种;
- 算法很多,如果由一个角色来处理的话,逻辑会非常混乱;
- 算法不可让客户端知道。
策略模式的最大优点在于把算法分门别类,由不同的实体类来维护,实现了算法本身与算法的使用者之间的弱耦合。而且把一个搅在一起的大算法分而治之,避免了大量使用条件而造成的混乱。
应用实例:
排序策略系统,参见《Java与模式》本章。
相关模式:
以下模式在结构上与策略模式相似,它们的区别多半在于用意不同,适用的场景是不同的。
- 策略模式:强调的是算法的分治与选择。
- 建造模式:它的核心功能是以一步一步的方式创建一个产品,把各个零件分别制造并组装起来,最后形成一个产品。
- 适配模式:它的用意在于把不同接口的对象“转接”成客户端所需要的接口。
- 装饰模式:它的用意在于在不改变接口的情况下,增强一个对象的功能。
示例代码:
[java]// Source code from file: ConcreteStrategyA.java package designPatterns.Strategy; public class ConcreteStrategyA implements Strategy {public void strategy() {System.out.println("ConcreteStrategyA.strategy()");}} // Source code from file: ConcreteStrategyB.java package designPatterns.Strategy; public class ConcreteStrategyB implements Strategy {public void strategy() {System.out.println("ConcreteStrategyA.strategy()");}} // Source code from file: Context.java package designPatterns.Strategy; public class Context {private Strategy strategy; public void strategy(char type) {if ('A' == type)strategy = new ConcreteStrategyA();else if ('B' == type)strategy = new ConcreteStrategyB();strategy.strategy();}} // Source code from file: Strategy.java package designPatterns.Strategy; public interface Strategy {public void strategy();} // Source code from file: User.java package designPatterns.Strategy; public class User {public static void main(String[] args) {Context ctxt = new Context();ctxt.strategy('A');ctxt.strategy('B');}}[/java]
转载于:https://blog.51cto.com/2ndmoon/1283698
策略模式/Strategy相关推荐
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 策略模式(Strategy)简介
一, 回顾简单工厂模式(SimpleFactory) 上一篇博文: http://blog.csdn.net/nvd11/article/details/41855937 还是用回那个计算器作例子. ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- Java策略模式(Strategy)
文章目录 策略模式(Strategy) 一.不使用策略模式 二.使用策略模式 1.案例类图 2.案例实现 3.总结 4.开发中的使用场景 策略模式(Strategy) 一.不使用策略模式 使用场景: ...
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
最新文章
- android布局优化方案,Android启动优化-布局优化
- 疑难杂症——解决 Cinder 僵尸卷问题
- android 牛人必修 ant 编译android工程
- 给HttpClient添加请求头(HttpClientFactory)
- 用户操作-用户详情服务器端代码实现
- HTML5 SVG
- 2019世界大学排名全新出炉!清华北大排名大幅下滑?
- Ajax ControlToolkit - AnimationExtender Action语法(笔记)
- [mount]linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb
- 备份表或者备份表结构
- ins与apache的区别_既然nginx比apache快,为什么nginx没有取代apache?
- NTKO Office乱码问题
- 【MySql】mysql之用户管理
- 招商银行深圳分行二面(技术面试)
- docker - bridge 网桥
- Notepad++搜索结果窗找不见了
- Java学习笔记(五):一张图总结完JVM8基础概念
- 【华为OD机试 2023】 最多获得的短信条数/云短信平台优惠活动(C++ Java JavaScript Python)
- 为你推荐一款高效的IO组件——okio
- C语言-求矩阵的对角线之和