策略模式/Strategy

意图/适用场景:

策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以互换。这样做的好处是,客户端可以以插件的方式更换算法。

电子商务网站的购物车系统是一个策略模式非常适用的场景:比如,在优惠方式上,某一类商品是每件优惠一元,另一类商品是折扣5%,还有一类商品也是打折,但折扣幅度是10%。所以需要应用不同的优惠算法来计算最终的价格。

在这个系统中,可以想象到会有一个计算者角色(与本模式中的Context相同功能),它负责计算价格。但如果把所有的算法都放在它里面来实现的话,会比较混乱。如果应用策略模式的话,就可以把行为和上下文环境分开。上下文类(计算者)中负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响到上下文和客户端。这也为上下文类减轻了负担。

UML:

参与者:

  1. 上下文角色(Context):持有一个Strategy类的引用。
  2. 抽象策略角色(Strategy):抽象角色,通常是一个接口或者抽象类。定义出所有的具体策略类的公共接口。如果具体策略类有共同的行为,可以把Strategy定义为抽象类,并实现这些公共的行为;否则最好定义为接口。
  3. 具体策略(ConcreteStrategy):包装了相关的算法或行为。

要点:

在下面的情况下应当考虑使用策略模式:

  1. 系统需要动态地在多种算法中选择一种;
  2. 算法很多,如果由一个角色来处理的话,逻辑会非常混乱;
  3. 算法不可让客户端知道。

策略模式的最大优点在于把算法分门别类,由不同的实体类来维护,实现了算法本身与算法的使用者之间的弱耦合。而且把一个搅在一起的大算法分而治之,避免了大量使用条件而造成的混乱。

应用实例:

排序策略系统,参见《Java与模式》本章。

相关模式:

以下模式在结构上与策略模式相似,它们的区别多半在于用意不同,适用的场景是不同的。

  1. 策略模式:强调的是算法的分治与选择。
  2. 建造模式:它的核心功能是以一步一步的方式创建一个产品,把各个零件分别制造并组装起来,最后形成一个产品。
  3. 适配模式:它的用意在于把不同接口的对象“转接”成客户端所需要的接口。
  4. 装饰模式:它的用意在于在不改变接口的情况下,增强一个对象的功能。

示例代码:

   [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相关推荐

  1. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  2. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  3. 策略模式(Strategy)简介

    一, 回顾简单工厂模式(SimpleFactory) 上一篇博文: http://blog.csdn.net/nvd11/article/details/41855937 还是用回那个计算器作例子. ...

  4. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  5. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  6. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  7. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

  8. Java策略模式(Strategy)

    文章目录 策略模式(Strategy) 一.不使用策略模式 二.使用策略模式 1.案例类图 2.案例实现 3.总结 4.开发中的使用场景 策略模式(Strategy) 一.不使用策略模式 使用场景: ...

  9. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

最新文章

  1. android布局优化方案,Android启动优化-布局优化
  2. 疑难杂症——解决 Cinder 僵尸卷问题
  3. android 牛人必修 ant 编译android工程
  4. 给HttpClient添加请求头(HttpClientFactory)
  5. 用户操作-用户详情服务器端代码实现
  6. HTML5 SVG
  7. 2019世界大学排名全新出炉!清华北大排名大幅下滑?
  8. Ajax ControlToolkit - AnimationExtender Action语法(笔记)
  9. [mount]linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb
  10. 备份表或者备份表结构
  11. ins与apache的区别_既然nginx比apache快,为什么nginx没有取代apache?
  12. NTKO Office乱码问题
  13. 【MySql】mysql之用户管理
  14. 招商银行深圳分行二面(技术面试)
  15. docker - bridge 网桥
  16. Notepad++搜索结果窗找不见了
  17. Java学习笔记(五):一张图总结完JVM8基础概念
  18. 【华为OD机试 2023】 最多获得的短信条数/云短信平台优惠活动(C++ Java JavaScript Python)
  19. 为你推荐一款高效的IO组件——okio
  20. C语言-求矩阵的对角线之和

热门文章

  1. ios7以后隐藏状态栏
  2. 2014 年度 Git@OSC 最热门的 50 个项目
  3. Android SlidingMenu 仿网易新闻客户端布局
  4. 有关Cassandra节点之间的通信:Gossip【译】
  5. ASP.net控件开发系列(四)
  6. ABAP操作Excel(转)
  7. leetcode141. 环形链表
  8. sqlmap中的php,python - sqlmap源码中的一个问题
  9. gin c.Next()方法
  10. Java获取请求客户端的真实IP地址