1.场景模拟

简单的报价管理系统:
对于普通用户和新用户报全价
对于老客户统一折扣5%
对于大客户统一折扣10%

2.不用模式的解决方案

package demo16.strategy.example2;
/*** 价格管理,主要完成计算向客户所报价格的功能*/
public class Price {/*** 报价,对不同类型的,计算不同的价格* @param goodsPrice 商品销售原价* @param customerType 客户类型* @return 计算出来的,应该给客户报的价格*/public double quote(double goodsPrice,String customerType){if("普通客户".equals(customerType)){return this.calcPriceForNormal(goodsPrice);}else if("老客户".equals(customerType)){return this.calcPriceForOld(goodsPrice);}else if("大客户".equals(customerType)){return this.calcPriceForLarge(goodsPrice);       }//其余人员都是报原价return goodsPrice;}/*** 为新客户或者是普通客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForNormal(double goodsPrice){System.out.println("对于新客户或者是普通客户,没有折扣");return goodsPrice;}/*** 为老客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForOld(double goodsPrice){System.out.println("对于老客户,统一折扣5%");return goodsPrice*(1-0.05);}/*** 为大客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForLarge(double goodsPrice){System.out.println("对于大客户,统一折扣10%");return goodsPrice*(1-0.1);  }
}

3.有何问题?

会经常有这样的需要,在公司周年庆的时候,所有的客户额外增加3%的折扣,在换季的时候普通用户额外增加3%的折扣,然后过了促销时间,价格又要涨回来,那么这个价格类将会非常的庞大,而且,方法非常的多。
看到这,朋友们很快就想到:如何实现才能让价格类中的计算报价的算法,很容易的实现可维护,可扩展,而且可以动态的切换变化呢?

4.使用策略模式来解决问题

4.1策略模式定义

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

4.2策略模式的结构图

4.3策略模式示例代码

package demo16.strategy.example3;/*** 策略,定义算法的接口*/
public interface Strategy {/*** 某个算法的接口,可以有传入参数,也可以有返回值*/public void algorithmInterface();
}
*********************************************************************
package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyA implements Strategy {public void algorithmInterface() {//具体的算法实现     }}
*********************************************************************
package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyB implements Strategy {public void algorithmInterface() {//具体的算法实现     }}package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyC implements Strategy {public void algorithmInterface() {//具体的算法实现     }
}
*********************************************************************
package demo16.strategy.example3;/*** 上下文对象,通常会持有一个具体的策略对象*/
public class Context {/*** 持有一个具体的策略对象*/private Strategy strategy;/*** 构造方法,传入一个具体的策略对象* @param aStrategy 具体的策略对象*/public Context(Strategy aStrategy) {this.strategy = aStrategy;}/*** 上下文对客户端提供的操作接口,可以有参数和返回值*/public void contextInterface() {//通常会转调具体的策略对象进行算法运算strategy.algorithmInterface();}
}

5.使用策略模式重写实例

package demo16.strategy.example4;/*** 策略,定义计算报价算法的接口*/
public interface Strategy {/*** 计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/public double calcPrice(double goodsPrice);
}
************************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为新客户或者是普通客户计算应报的价格*/
public class NormalCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于新客户或者是普通客户,没有折扣");return goodsPrice;}
}
***********************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为老客户计算应报的价格*/
public class OldCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于老客户,统一折扣5%");return goodsPrice*(1-0.05);}
}
***********************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为大客户计算应报的价格*/
public class LargeCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于大客户,统一折扣10%");return goodsPrice*(1-0.1);}
}
***********************************************************************
package demo16.strategy.example4;
/*** 价格管理,主要完成计算向客户所报价格的功能*/
public class Price {/*** 持有一个具体的策略对象*/private Strategy strategy = null;/*** 构造方法,传入一个具体的策略对象* @param aStrategy 具体的策略对象*/public Price(Strategy aStrategy){this.strategy = aStrategy;}  /*** 报价,计算对客户的报价* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/public double quote(double goodsPrice){return this.strategy.calcPrice(goodsPrice);}
}
***********************************************************************
package demo16.strategy.example4;public class Client {public static void main(String[] args) {//1:选择并创建需要使用的策略对象Strategy strategy = new LargeCustomerStrategy();//2:创建上下文Price ctx = new Price(strategy);//3:计算报价double quote = ctx.quote(1000);System.out.println("向客户报价:"+quote);}
}

6.模式讲解

6.1要点

功能:把具体的算法从具体的业务处理中独立出来,把他们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略算法是相同行为的不同实现
什么时候选用
:多个if-else语句的时候就可以选用

6.2策略模式的调用顺序示意图

首先客户端选择并创建具体的策略对象
其次创建上下文
最后调用上下文的方法来执行功能了

6.3当添加新的策略时候

只需要动下面代码,是不是很简单,很方便呢?
//1:选择并创建需要使用的策略对象
Strategy strategy = new LargeCustomerStrategy();

6.4另一种策略模式调用示意图

6.5策略模式优缺点

优点:定义一系列算法,避免使用多重条件语句,更好的扩展性
缺点:客户端必须了解每种策略的不同,增加了对象数目,只适合扁平的算法结构(地位平等的算法)

6.6设计模式的本质

分离算法,选择实现

设计模式18---设计模式之策略模式(Strategy)(行为型)相关推荐

  1. Headfirst设计模式的C++实现——策略模式(Strategy)

    前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h 1 #inc ...

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

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

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

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

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

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

  5. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

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

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

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

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

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

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

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

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

  10. 设计模式(二)--策略模式

    1.策略模式 在策略模式中,我们可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类我们都可以称之为一种策略(Strategy),为了保证这些策略在使用时具有一 ...

最新文章

  1. 成功解决ModuleNotFoundError: No module named 'dataset'
  2. jupyter notebook 删除指定kernel
  3. 百度智能云拿下MTCS最高安全评级,企业出海再添安全通道
  4. 科研福利!国内TOP3的超算中心,免费领2000核时计算资源
  5. java打字游戏代码_牛逼啊!一个随时随地写Python代码的神器
  6. cookie跨域_跨域问题的复现与整理
  7. $Django Paginator分页器 批量创建数据
  8. 83、冗余网关配置实验之VRRP
  9. 联想e470锁定计算机,thinkpad如何锁定键盘_联想thinkpad键盘锁怎么操作-win7之家
  10. 这就是艺术「GitHub 热点速览 v.22.25」
  11. 软件测试工程师工作必备模板五件套
  12. Markdown编辑器简单大概语法学习
  13. jquery固定table第一列或第一行
  14. 设计任务调度依赖配置表
  15. 3.APP推广有哪些渠道
  16. Dashboard Design 4.0(Xcelsius)数据直接绑定功能:瑕瑜互见
  17. 命令提示窗口输出汉字
  18. wordpress采集插件-wordpress关键词插件-wordpress百度推送插件-wordpress蜘蛛统计分析插件
  19. 计算机科学——计算机导论
  20. Django cms 教程六:集成博客/新闻模块

热门文章

  1. 分类算法——朴素贝叶斯分类
  2. 安卓Activity界面切换添加动画特效
  3. 数据结构之单链表尾插法创建-RearCreate
  4. 一起谈.NET技术,Visual Studio 2010 中的代码约定设置
  5. linux下实现作业调度程序,Linux后台作业
  6. tddebug怎么读取asm文件_如何利用 ASM 实现既有方法的增强?
  7. 玩转OpenVswitch:简介
  8. 洛谷 [P1801] 黑匣子
  9. jdbc-connect-oracle12c-pdb/cdb(jdbc连接oracle12c的pdb和cdb)
  10. WPF 根据绑定值设置DataGrid行背景色