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

策略模式:
顾名思义即是:我提供不同的策略然后你自己选择即可。

定义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

小提示:
面向对象编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。

请看类图

其中CashContext和CashSuper是聚合的关系,因为关联关系在VS中显示不出来。

下面请揭晓真正的代码(Windows)

First:父子关系类

  /// <summary>/// 现金收费抽象类/// </summary>abstract class CashSuper{public abstract double acceptCash(double money);//现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价}/// <summary>/// 正常收费子类/// </summary>class CashNormal : CashSuper{public override double acceptCash(double money){//正常收费,原价返回return money;}}/// <summary>/// 打折收费子类/// </summary>class cashRebate : CashSuper{private double moneyRebate = 1d;public cashRebate(string moneyRebate){//打折收费,初始化时,必需要输入折扣率,如八折,就是0.8this.moneyRebate = double.Parse(moneyRebate);}public override double acceptCash(double money){return money * moneyRebate;}}/// <summary>/// 返利收费子类/// </summary>class CashReturn : CashSuper{private double moneyCondition = 0.0d;private double moneyReturn = 0.0d;//返利收费,初始化时必须要输入返利条件和返利值,比如满300反100,则moneyCondition为300,monneyRetrun为100public CashReturn(string moneyCondition, string moneyReturn){this.moneyCondition = double.Parse(moneyCondition);this.moneyReturn = double.Parse(moneyReturn);}public override double acceptCash(double money){double result = money;//若大于返利条件,则需要减去返利值if (money >= moneyCondition){result = money - Math.Floor(money / moneyCondition) * moneyReturn;}return result;}}

Secend: 添加一个工厂:

       /// <summary>/// CashContext类/// </summary>class CashContext{CashSuper  cs = null;public CashContext(string type){switch (type ){case "正常收费":CashNormal cs0 = new CashNormal();cs = cs0;break;case "满300反100":CashReturn cr1 = new CashReturn("300", "100");cs = cr1;break;case "打8折":cashRebate cr2 = new cashRebate("0.8");cs = cr2;break;}}//根据收费策略的不同,获得计算结果public double GetResult(double money){return cs.acceptCash(money);}}

添加一个自动加载

 //设置自动加载:只要是下拉框private void Form1_Load(object sender, EventArgs e){cbxType.Items.AddRange(new object[] { "正常收费", "满300反100", "打8折"});cbxType.SelectedIndex = 0;}

在客户端确定按钮中:

       //客户窗体程序double total = 0.0d;// 用于总计private void btnOk_Click(object sender, EventArgs e){CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());double totalprices = 0d;totalprices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));//通过对Context的GetResult方法的调用,可以得到收取费用的结果,让具体算法与客户进行了隔离total = total + totalprices ; //将每个商品合计计入总计。lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + "合计:" + totalprices.ToString ());//通过多态,可以得到收取费用的结果。lblResult.Text = total.ToString();  //lab标签上显示总数量            }

以下就是制作的代码界面,前面的计算器没有给出,这次补上:

小结:
本次打折如果想添加其他优惠情况,则直接添加一个新类继承接口即可,并在工厂里面添加一个 case做为选择并在下拉框中显示出来即可。

基本策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象,只是我用了一个工厂将客户端的选择放进了Context中,相当于用了分治算法将复杂问题给分开。

策略模式--实现商场打折相关推荐

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

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

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

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

  3. 策略模式一商场促销商品

    一模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二模式举例 1模式分析 我们借用商场促销商品来说明这一模式. 2策略模 ...

  4. 打折算法 Java_JAVA算法策略模式之商品打折 满x送x

    场景:某超市收银台,营业员根据客户购买的商品和数量向客户收费. 问题:超市某段时间会有打折活动(例如打8折),满XXX元送XXX元活动,满XXX元送XXX积分活动等等. 算法类,可能是打折,满XX送X ...

  5. JAVA算法策略模式之商品打折 满x送x

    场景:某超市收银台,营业员根据客户购买的商品和数量向客户收费. 问题:超市某段时间会有打折活动(例如打8折),满XXX元送XXX元活动,满XXX元送XXX积分活动等等. 算法类,可能是打折,满XX送X ...

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

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

  7. 算法的封装与切换——策略模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7818983 俗话说:条条大路通罗马.在很多情况下,实现某个目标的途径不止一条,例如我们在外 ...

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

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

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

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

最新文章

  1. 图像放大算法一:最近邻法(Nearest Interpolation)
  2. Bitmap的一个简单实现
  3. vue.js将一个对象的所有属性作为prop进行传递
  4. 说说成为顶级运营人员的一个先决条件:做事的霸气!
  5. 58 Openstack基础、openstack之glance、openstack之keystone
  6. PyTorch基础(13)-- torch.nn.Unfold()方法
  7. Caffe + ROS + OpenCV + Qt creator
  8. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车超声波避障实验(有舵机)
  9. 深度学习之卷积神经网络(11)卷积层变种
  10. C语言课后习题(48)
  11. 项目管理学习总结(6)——产品经理常用的工具有哪些?
  12. python小练——下载指定url中的图片
  13. 1039. Course List for Student (25)
  14. pandas输出到excel_精通Pandas,从零基础到中级运用,看这一篇就够了
  15. 外军网络空间作战简报
  16. 磁力计简单水平较准算法
  17. 当当年中庆,百万自营图书大放价,又有羊毛可以薅了
  18. 苏世民的54条人生成功经验
  19. 金融数据治理者视角:小微信用体系建设的进化路径
  20. Mac WiFi速度慢 WiFi卡

热门文章

  1. 大气等离子表面处理机 金铂利莱
  2. 有趣的流言称英特尔将收购AMD,这2家公司才是英特尔更好的目标...
  3. offer来啦(签约解约 公司待遇)---转自应届生,大家注意看看哈!忽忽
  4. 2020年生态红线调整技术方案----解读
  5. Chrome浏览器高效插件/外挂总结
  6. oracle数据库时钟,oracle11g巡检RAC数据库
  7. 虚幻骨骼重定向-TPos
  8. 计算机二级WPS 选择题(模拟和解析十一)
  9. matlab 信号频域分析,如何使用matlab进行频域分析
  10. 2021年中国氧气治疗仪市场趋势报告、技术动态创新及2027年市场预测