商场收银时,如何促销,用打折还是返利,其实都是一些算法,用工厂来生成算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,就这点变化,而封装变化点是我们面向对象的一种很重要的思维方式。来看看策略模式的结构图和基本代码。策略模式(Strategy):定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的,不会影响到使用算法的客户。策略模式(Strategy)结构图如下:


1. 现金收费接口
2. 正常收费子类
3. 打折收费子类
4. 返利收费子类
5. 现金收费CashContext类
6. 客户端代码
具体如下:
1.现金收费接口:
public interface CashSuper {

public double exceptCash(double money);

}
2.正常收费子类:
public class CashNormal implements CashSuper{

@Override
public double exceptCash(double money) {// TODO Auto-generated method stubreturn money;
}

}

3.打折收费子类
public class CashRebate implements CashSuper{

private double moneyRebate = 1;
public CashRebate(double moneyRebate){this.moneyRebate = moneyRebate;
}
public double exceptCash(double money) {// TODO Auto-generated method stubreturn money * moneyRebate;
}

}
4.返利收费子类
public class CashReturn implements CashSuper {

private double moneyCondition = 0;
private double moneyReturn = 0;public CashReturn(double moneyCondition, double moneyReturn) {this.moneyCondition = moneyCondition;this.moneyReturn = moneyReturn;
}public double exceptCash(double money) { double result = money; if (money >= moneyCondition) { int temp=(int)(money/moneyCondition); result = money -temp* moneyReturn; } return result;
}

}
5.现金收费CashContext类 客户端代码
public class CashContext {

CashSuper cashSuper;public CashContext(CashSuper cashSuper) {this.cashSuper = cashSuper;
}public CashContext(String type) {if ("正常收费".equals(type)) {cashSuper = new CashNormal();} else if ("满300返100".equals(type)) {cashSuper = new CashReturn(300, 100);} else if ("打8折".equals(type)) {cashSuper = new CashRebate(0.8);}
}public double acceptCash(double money) {return cashSuper.exceptCash(money);
}

}
6.客户端代码
public class Main {

private static double total = 0;public static void main(String[] args) {// TODO Auto-generated method stubconsume("正常收费", 1, 1000);consume("满300返100", 1, 1000);consume("打8折", 1, 1000);System.out.println("总计:" + total);
}public static void consume(String type, int num, double price) {CashContext cashContext = new CashContext(type);double totalPrices = cashContext.acceptCash(num * price);total += totalPrices;System.out.println("单价:" + price + " 数量:" + num + "合计:" + totalPrices);
}

}
回过头来反思一下策略模式,策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法与使用算法之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。对于打折、返利或者其他的算法,其实都是对实际商品收费的一种计算方式,通过继承,可以得到它们的公共功能。
优点:
1.简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
2.每个算法可保证它没有错误,修改其中任一个时也不会影响其他的算法,这真是的非常的好。
缺点:
1.必须知道所有策略类,这一问题可以由工厂模式加以解决。
2.产生很多策略类,这一问题可以使用享元模式加以解决。

商场促销——策略模式(设计模式)相关推荐

  1. 2.商场促销 - 策略模式 (大话设计模式Kotlin版)

    编程题:制作商场收银软件 利用编程做一个简易的商场收银系统,营业员根据客户购买的商品的单价与数量,向客户收费. 快速实现 马上想到的解决思路:无非是提供两个输入,分别对应商品单价与数量,然后通过计算得 ...

  2. 大话设计模式——第二章:商场促销策略模式

    文章目录 前言 一.代码1.0 1.1. 代码 2.2. 存在的问题 二.代码1.1 增加打折 2.1. 代码 2.2. 存在的问题 三.代码2.0 使用简单工厂写打折类和返利类 3.1. 代码 3. ...

  3. 商场促销 --- 策略模式

    一,概念 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 二,策略模式的组成 1)抽象策略角色: 策略类,通常由一个接口或者 ...

  4. 商场促销——策略模式

    策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. "面向对象的编程,并不是类越多越好,类的划分是为了封装, ...

  5. 大话设计模式笔记(二)——商品促销 策略模式

    第二章商品促销--策略模式 需求:商品价格计算,并增加折扣条件 工厂模式UML图 在工厂模式中,调用端代码会通过折扣工厂类生成折扣对象,折扣对象调用折扣方法.这里关联了两个类,工厂类和抽象折扣类. 策 ...

  6. 策略模式(示例1:通过实现Comparator接口定义不同的比较策略;示例2:促销策略)-设计模式

    目录 1.基本说明 2.比较一般对象大小,实现对象排序 (1)实现Comparable接口,定义了单种比较的规则 (2)实现Comparator接口,对于多种比较规则做到扩展兼容 3.另一个例子:促销 ...

  7. 烧烤促销--策略模式

    ​小kim菌:菜菜,刚才我去买烧烤,满5块减2块!烧烤大叔算得手忙脚乱! 小菜菌:哈哈,买5块减2块,那买10块,减4块... 小kim菌:那买10086块呢 饥饿的小菜菌想了想,甩出一行代码. // ...

  8. 【C++实现】HeadFirst策略模式设计模式

    策略模式定义了算法家族.分别封装起来.让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户. Head First设计模式中介绍策略模式时以Duck类作为样例.当中用flyBehavior和 ...

  9. 商品促销——策略模式

    Java代码 /** * <h1>策略模式</h1> * QS:做个商场收银软件,营销员根据客户所购买的商品和数量向客户收费 第一次程序 * @author xangqun * ...

最新文章

  1. ICinsights:中国芯片难达成既定的2025目标
  2. java extend 和 implements 的区别
  3. Linux命令-chmod、chown和chgrp
  4. python2.7读汉字的时候出现乱码,如何解决
  5. Oracle分析函数-rank() over(partition by...order by...)
  6. (转帖)开源容器集群管理系统Kubernetes架构及组件介绍
  7. java调用jndi出错,无法使用Java JNDI上下文查找来访问对象
  8. Python--JSON基础
  9. html5访问电脑或手机摄像头
  10. python文件操作(路径、移动、复制、见目录)
  11. .net 调用css/javascipt出现的问题及解决
  12. 硬盘坏了怎么恢复数据,需要哪些设备
  13. linux opengl安装教程,Linux下OpenGL的安装与cmake编译OpenGL程序
  14. Falsy Bouncer 过滤数组假值
  15. linux内网穿透(内外网服务器端口映射)
  16. 串口/U(A/S)RT(RS232/RS485/RS422协议等)
  17. opencv图像旋转和翻转,cv2.flip,cv2.rotate
  18. 滴滴柳青:一个比你有才,又比你努力的富二代!
  19. 装双系统win10和android,“专治”选择恐惧症,Win10/安卓双系统设备怎么用?
  20. Rust之包,箱和模块管理(四):用use关键字引用其他包

热门文章

  1. 为何一套心理素质测评解决不了员工入职的心理筛查问题?
  2. python能爬国外的网站吗_我是如何分析和爬取外国网站的图片
  3. 【安全知识分享】第二部分灭火器配置及消防设施(附下载)
  4. IoT入门概述与物联网安全基础
  5. axios请求express上传保存图片
  6. 老毛桃制作工具,免广告制作纯净USB启动盘的方法。
  7. 使用.NET进行中文繁简转换的两种方法
  8. Python爬取彩票双色球并存到把数据excel表格里
  9. 计算机xp考试模块,职称计算机考试XP模块题库
  10. imx6q烧写程序的方法