策略模式(strategy)

策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一种算法解决某一问题;同时,可以方便的更换算法或增加新的算法;并且由客户决定调用哪个算法。

1、提出问题:实现一个根据客户类型获取商品价格的方法,如下:

public class strategyDemo1
{public double getPrice(String type, double price){if("普通客户小批量".equals(type)){System.out.println("不打折, 原价");return price;}else if ("普通客户大批量".equals(type)){System.out.println("打九折");return price * 0.9;}else if ("老客户小批量".equals(type)){System.out.println("打八五折");return price * 0.85;}else if ("老客户大批量".equals(type)){System.out.println("打八折");return price * 0.8;}else{return price;}}
}

以上的实现比较基础,能够解决我们的问题,但是存在以下几个问题

(1)若类型比较多, 实现复杂时, 整个条件语句的代码就变得特别长, 难于维护;

(2)若新增类型, 则需要频繁的修改代码, 这就违反了开闭原则;

2、为了解决以上问题,我们使用策略模式来实现;

策略模式的实现类图,如下所示:

算法的接口(Strategy),如下所示:

public interface Strategy
{public double getPrice(double standardPrice);
}

新客户小批量算法类(NewCustomerFewStrategy ),如下所示:

public class NewCustomerFewStrategy implements Strategy
{@Overridepublic double getPrice(double standardPrice){System.out.println("不打折");return standardPrice;}
}

新客户大批量算法类(NewCustomerManyStrategy ),如下所示:

public class NewCustomerManyStrategy implements Strategy
{@Overridepublic double getPrice(double standardPrice){System.out.println("打九折");return standardPrice * 0.9;}
}

老客户小批量算法类(OldCustomerFewStrategy ),如下所示:

public class OldCustomerFewStrategy implements Strategy
{@Overridepublic double getPrice(double standardPrice){System.out.println("打八五折");return standardPrice * 0.85;}
}

老客户大批量算法类(OldCustomerManyStrategy ),如下所示:

public class OldCustomerManyStrategy implements Strategy
{@Overridepublic double getPrice(double standardPrice){System.out.println("打八折");return standardPrice * 0.8;}
}

Context实现类:算法和客户直接分离了, 使得算法可以独立于客户端的独立变化

public class Context
{private Strategy strategy; //当前采用的算法//使用构造器注入public Context(Strategy strategy){this.strategy = strategy;}public void printPrice(double s){System.out.println("您该报价:" + strategy.getPrice(s));}
}

测试类,如下所示:

public class TestStrategy
{public static void main(String[] args){//获取新客户大批量算法Strategy strategy = new NewCustomerManyStrategy(); Context context = new Context(strategy);context.printPrice(1000);}
}

结果如下:

  打九折
  您该报价:900.0

转载于:https://www.cnblogs.com/yufeng218/p/10086158.html

设计模式(六)---- 策略模式相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案
  2. 嵌入式视频处理考虑(一)
  3. 将yolo标注转换为tensorflow_yolov3标注生成train.txt和test.txt同时做数据清洗
  4. 使用tensorflow出现 ImportError: DLL load failed: 找不到指定的程序
  5. 原创 Reflector 8.1 反激活
  6. junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?
  7. Linux编程手册读书笔记第五章(20140408)
  8. spring boot报FileSizeLimitExceededException异常的解决方法
  9. 更换ssh通信证书,ssh更改公钥和密钥,以保证服务器安全
  10. 斯坦福机器学习课程 Exercise 习题三
  11. arm poky linux,opencv移植在4412和imx6(yocto 3.14.28 arm-poky-linux-gnueabi )上
  12. 实习成长之路:DelayQueue多线程下的延迟队列的使用
  13. js常用设计模式实现(一)单例模式
  14. 牛客网面试题总结(试券)
  15. QQ群管机器人html官网源码
  16. 线上问题:nginx日志打印时间问题
  17. 记一次超好用下载器you-get复活
  18. 爱国者p8880e java_口袋里的电脑 爱国者P8880E MID评测
  19. 卡片跳转快应用指定页面,如何点返回直接退出快应用回到卡片
  20. 自律努力有目标的人生有多美

热门文章

  1. 搜索日志文件的linux,linux日志查找
  2. 用java编写圆锥_求java大神帮忙 求大神帮助!Java
  3. git rebase基础
  4. TensorFlow 保存和加载模型
  5. 1.3 单一数字评估指标
  6. matplotlib color 参数
  7. c语言数组处理实验报告心得体会,C语言实验报告总结计划数组.doc
  8. 通过options探测服务器信息,WEB服务器启用了OPTIONS方法
  9. cp210x驱动运行不了怎么解决_【问题】解决Android8.0以上运行不了uiautomatorviewer的办法...
  10. vcsa上RVC查看vsan状态的命令