一模式定义

策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。

二模式举例

1模式分析

我们借用商场促销商品来说明这一模式。

2策略模式静态类图

3代码示例

3.1 创建策略接口一IStrategy

package com.demo.strategy;/*** 策略接口* * @author* */
public interface IStrategy {/*** 计算实际价格方法* * @param consumePrice*            消费金额* @return*/public double realPrice(double consumePrice);
}

3.2 八折促销策略一RebateStrategy

package com.demo.strategy;/*** 打八折商品促销策略* * @author* */
public class RebateStrategy implements IStrategy {private final double rate;/*** 构造方法设置打折率*/public RebateStrategy() {this.rate = 0.8;}/*** 计算实际价格方法* * @param consumePrice*            消费金额* @return*/public double realPrice(double consumePrice) {return consumePrice * this.rate;}}

3.3 满1000减200促销策略一ReduceStrategy

package com.demo.strategy;/*** 满1000减200 商品促销策略* * @author* */
public class ReduceStrategy implements IStrategy {/*** 计算实际价格方法* * @param consumePrice*            消费金额* @return*/public double realPrice(double consumePrice) {if (consumePrice >= 1000) {return consumePrice - 200;} else {return consumePrice;}}
}

3.4 200以上部分打8折促销策略一PromotionalStrategy

package com.demo.strategy;/*** 满200,高于200部分打八折 商品促销策略* * @author* */
public class PromotionalStrategy implements IStrategy {/*** 计算实际价格方法* * @param consumePrice*            消费金额* @return*/public double realPrice(double consumePrice) {if (consumePrice > 200) {return 200 + (consumePrice - 200) * 0.8;} else {return consumePrice;}}
}

3.5 创建上下文环境一Context

package com.demo.context;import java.math.BigDecimal;import com.demo.strategy.IStrategy;/*** 上下文环境* * @author* */
public class Context {// 当前策略private IStrategy strategy;// 设置当前策略public void setStrategy(IStrategy strategy) {this.strategy = strategy;}// 使用策略计算价格public double cul(double consumePrice) {// 使用具体商品促销策略获得实际消费金额double realPrice = this.strategy.realPrice(consumePrice);// 格式化保留小数点后1位,即:精确到角BigDecimal bd = new BigDecimal(realPrice);bd = bd.setScale(1, BigDecimal.ROUND_DOWN);return bd.doubleValue();}
}

3.6 消费者购物消费一Client

package com.demo;import java.util.Random;/*** 客户端应用程序* * @author* */
public class Client {/*** @param args*/public static void main(String[] args) {// 创建上下问环境对象实例// Context context = new Context();// 随机数对象Random random = new Random();for (int i = 0; i < 10; i++) {// 产生随机数的方式判断使用何种促销策略int x = random.nextInt(3);// 消费价格也是由随机数产生的(不能为0)double consumePrice = 0;while ((consumePrice = random.nextInt(2000)) == 0) {}double realPrice = consumePrice;switch (x) {case 0:// 打八折商品// context.setStrategy(new RebateStrategy());realPrice = consumePrice * 0.8;break;case 1:// 满200,高于200部分打八折 商品// context.setStrategy(new PromotionalStrategy());if (consumePrice > 200) {realPrice = 200 + (consumePrice - 200) * 0.8;}break;case 2:// 满1000减200 商品// context.setStrategy(new ReduceStrategy());if (consumePrice >= 1000) {realPrice = consumePrice - 200;}break;}System.out.print("【"+ (x == 0 ? "打八折" : (x == 1 ? "高于200部分打八折": (x == 2 ? "满1000减200" : ""))) + "】商品:");System.out.println("原价:" + consumePrice + " - 优惠后价格:" + realPrice);}}
}

4运行结果

【满1000减200】商品:原价:908.0 - 优惠后价格:908.0

【满1000减200】商品:原价:1129.0 - 优惠后价格:929.0

【满1000减200】商品:原价:829.0 - 优惠后价格:829.0

【打八折】商品:原价:518.0 - 优惠后价格:414.40000000000003

【满1000减200】商品:原价:1230.0 - 优惠后价格:1030.0

【打八折】商品:原价:106.0 - 优惠后价格:84.80000000000001

【满1000减200】商品:原价:1134.0 - 优惠后价格:934.0

【高于200部分打八折】商品:原价:664.0 - 优惠后价格:571.2

【满1000减200】商品:原价:564.0 - 优惠后价格:564.0

【满1000减200】商品:原价:730.0 - 优惠后价格:730.0

三该模式设计原则

1"开-闭"原则

2单一职责原则

四使用场合

1当多个类的表现行为不同,需要在运行时刻动态选择具体执行的行为的时候。

2需要在不同情况下使用不同策略,或者策略还可能在未来用其它方式实现的时候。

3需要隐藏具体策略的实现细节,各个具体策略彼此独立的时候。

4当一个类中出现了多种行为,而且在一个操作中使用多个条件分支来判断使用多种行为的时候,可以使用策略模式将各个条件分支的动作植入具体策略中实现。

五策略模式静态类图

策略模式一商场促销商品相关推荐

  1. java商场满减活动_Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的 ...

  2. 基于策略模式的商场价格优惠设计

    基于策略模式的商场价格优惠设计 本文为个人的论文,由于一些原因未能发表,所以拿出来和朋友分享下 注:本文配有源码,如有需要的朋友,请在留言中留下邮箱地址,我会在第一时间发送     本文介绍一种基于策 ...

  3. 策略模式--实现商场打折

    前言: 上一篇博客中写明了简单工厂的引用,其实这篇博客和上一篇类似,是利用了策略加简单工厂的方法实现的.为了我们的重构可以运用上设计模式,本次运用了客户端的形式展现出来,具体请往下看: 策略模式: 顾 ...

  4. 【Design pattern】简单工厂过渡策略模式

    把自己当做小菜来跟学<大话设计模式>,跟着故事的思路来走 简单工厂模式:实现一个计算器代码 策略模式:商场打折代码 根据大鸟和小菜的故事,一步步的完善问题的过程!

  5. 设计模式四:策略模式

    策略模式 所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊.积分等等之类的.这种不同的促销方式在我们系统中表示就是一个一个的策略,并 ...

  6. 简说设计模式——策略模式

    一.什么是策略模式 策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车.坐公交.坐火车.坐飞机.坐火箭等等,这些出行方式,每一种都是一个策略. 再比如我们去逛商场,商 ...

  7. 大话设计模式——策略模式

    1)商场收银系统 import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing. ...

  8. C++设计模式学习笔记:策略模式

    C++设计模式学习笔记:策略模式 策略模式设计商场促销 1.策略模式介绍 2.商场收银系统策略模式实现 3.策略模式与工厂模式结合 3.策略模式与工厂模式对比 策略模式设计商场促销 1.策略模式介绍 ...

  9. php 商场收银收费系统,使用的策略模式

    <?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是 //策略模式 优惠系统.工资计算系统 ...

最新文章

  1. golang runtime.systemstack 泄漏排查
  2. awk读取txt生成mysql插入语句
  3. 【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )
  4. C++判断exe是32位还是64位
  5. KVM安装、镜像创建(一)
  6. java后台 ajax_ajax提交到java后台之后处理数据的实现
  7. python画布位置_如何调整tkinter画布的位置
  8. linux 蓝牙攻击,研究人员担心BleedingTooth蓝牙漏洞给Linux系统带来风险
  9. 我应该做哪个行业的销售
  10. Mybatis plus修改了Language Level后,IDEA运行应用出现了Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
  11. Nginx端口映射(外网访问)
  12. oracle8i odac for c,ODAC for delphi
  13. 服务器主动向android手机端推送消息
  14. 抖音超级恶心的滑稽HTML源码
  15. mongoDB——readwrite操作
  16. 程序员有话说,只务正业就够了吗?
  17. 程序猿必知英语词汇总结
  18. 程序员该如何把 Windows 系统打造的跟 Mac 一样牛逼?
  19. 2018华北五省计算机应用大赛,“远洋航空杯”2019年华北五省(市、自治区) 及港澳台大学生计算机应用大赛隆重举行...
  20. 利用 OpenWrt 共享局域网下的佳能 MG2580s/MX398打印扫描一体机

热门文章

  1. Android手机的上网功能需要用到APN(网络接入点)的设置 电信
  2. 【LeetCode】436. Find Right Interval 解题报告(Python)
  3. sdi线缆标准_12 Gbps SDI电缆性能介绍及12 Gbps SDI电缆性能估算
  4. iptable详解(2)
  5. Ajax是什么?Ajax有什么作用?Ajax过程,Ajax优缺点
  6. 电脑网速变慢的几个方面
  7. 从远程服务器上复制文件到本地电脑报错:复制文件或文件夹时出错---未指定的错误
  8. 《Head First HTML与CSS》笔记 ——1 Web语言
  9. HDU 3999 BST基础
  10. 【渝粤题库】国家开放大学2021春2502学前儿童发展心理学题目