北邮JAVA高级语言程序设计(选修课)设计模式大作业

题目描述:
设计模式一(单子、工厂、策略模式)练习
1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机图书有3%的折扣;对其余书没有折扣。使用策略模式、工厂模式、单子模式进行设计,类图如下。

类图说明:

Sale:代表依次销售。getTotal方法用于返回本次销售的优惠后总价。
SaleLineItem:代表一个销售项目。1次销售会对应多个销售项目。如顾客总共购买了2本《UML与模式应用》,3本《Java与模式》,则对应需要创建两个SaleLineItem对象,1个对应的是2本《UML与模式应用》的购买,1个对应的是3本《Java与模式》的购买。
ProductSpecification:书的描述信息,包括书的isbn号、书名、单价和书的类型。书的类型包括:非教材类的计算机图书、教材类图书、连环画类图书、其他共4种。在本例中共有5种书(见后面描述),因此需要创建5个ProductSpecification对象。
PricingStrategyFactory:策略工厂,负责根据书的类型提供对应的策略类,策略类将根据具体的优惠策略计算折扣后1个销售项目(SaleLineItem)的总价。要求:该策略工厂要设计成单子。
IPricingStrategy:策略类的接口,用于向SaleLineItem屏蔽具体的策略类。
FlatRateStrategy:按每本优惠x元的策略。
PercentageStrategy:按百分比进行优惠的策略。
NoDiscountStrategy:不进行优惠的策略。思考:为什么要设计这个类?如果没有这个类,会引发什么问题?
要求:设计中要考虑优惠的比例(如每本优惠1元、7%、3%)会发生变化?在设计时要考虑到这种变化,使得变化到来时,对现有代码的影响尽量小。
注意:本例中,策略是应用于1个SaleLineItem对象,而不是应用于Sale对象,为什么?

请用Java语言实现上述每一个类,并书写测试类,实现下述场景:
一次购物,购买了2本教材类图书《UML与模式应用》,单价是18元/本;购买了2本非教材类的计算机图书《Java与模式》,单价是34元/本;购买了1本非教材类的计算机图书《HeadFirst 设计模式》,单价是58元/本;购买了3本连环画类图书《爱丽丝历险记》,单价是30元/本;购买了1本其他类图书《煲汤大全》,单价是20元/本。请计算出本次购物优惠后价格。

源代码:

import java.util.ArrayList;
import java.util.Iterator;public class TestClass {public static void mian(String[] args){ProductSpecification p1 = new ProductSpecification("00001","UML与模式应用",18,"A");ProductSpecification p2 = new ProductSpecification("00001","Java与模式",34,"C");ProductSpecification p3 = new ProductSpecification("00003","HeadFirst设计模式",58,"C");ProductSpecification p4 = new ProductSpecification("00004","爱丽丝历险记",30,"B");ProductSpecification p5 = new ProductSpecification("00005","煲汤大全",20,"D");PricingStrategyFactory factor = PricingStrategyFactory.getInstance();SaleLineItem item1 = new SaleLineItem(2,p1,factor.getPricingStrategy(p1.getType()));SaleLineItem item2 = new SaleLineItem(2,p2,factor.getPricingStrategy(p2.getType()));SaleLineItem item3 = new SaleLineItem(1,p3,factor.getPricingStrategy(p3.getType()));SaleLineItem item4 = new SaleLineItem(3,p4,factor.getPricingStrategy(p4.getType()));SaleLineItem item5 = new SaleLineItem(1,p5,factor.getPricingStrategy(p5.getType()));Sale s = new Sale();s.addItem(item1);s.addItem(item2);s.addItem(item3);s.addItem(item4);s.addItem(item5);System.out.println("The total price is:"+String.format("%.2f",s.getTotal()));}
}//书的描述信息,包括书的isbn号、书名、单价和书的类型
class ProductSpecification
{String ISBN;String Name;double Price;String Type;public ProductSpecification(String ISBN, String Name, double Price ,String Type) {this.ISBN = ISBN;this.Name = Name;this.Price =Price;this.Type = Type;}public String getISBN() {return ISBN;}public String getName(){return Name;}public double getPrice() {return Price;}public String getType() {return Type;}
}//根据具体的优惠策略计算折扣后1个销售项目(SaleLineItem)的总价
class PricingStrategyFactory
{private static PricingStrategyFactory instance = new PricingStrategyFactory();private PricingStrategyFactory() {};public static PricingStrategyFactory getInstance() {return instance;}public IPricingStrategy getPricingStrategy(String BookType) {if(BookType.equals("A")) {return new FlatRateStrategy(1);//教材类图书,每本1元折扣}else if(BookType.equals("B")) {return new PercentageStrategy(7);//连环画类图书,每本7%折扣}else if(BookType.equals("C")) {return new PercentageStrategy(3);//非教材类的计算机图书,每本3%折扣}else {return new NoDiscountStrategy();//其它,没有折扣}}
}interface IPricingStrategy
{public double getSubTotal(SaleLineItem sli);//得到单本图书优惠后的价格
}class SaleLineItem
{private int copies;private ProductSpecification prodSpec;private IPricingStrategy strategy;public SaleLineItem(int copies, ProductSpecification prodSpec, IPricingStrategy strategy){this.copies = copies;this.prodSpec = prodSpec;this.strategy = strategy;}public double getSubTotal() {return copies*(strategy.getSubTotal(this));} //得到此种图书,优惠后的价格public ProductSpecification getPro(){return prodSpec;}
}class FlatRateStrategy implements IPricingStrategy
{private double discountPerBook;public FlatRateStrategy(double a){discountPerBook = a;}  //构造函数public double getSubTotal(SaleLineItem sli) {return sli.getPro().getPrice()-discountPerBook; //原先的价格-优惠的价格}
}class PercentageStrategy implements IPricingStrategy
{private int discountPercentage;public PercentageStrategy(int a) {discountPercentage = a;}public double getSubTotal(SaleLineItem sli) {double discount = discountPercentage/100.0;return sli.getPro().getPrice()*(1-discount);//原先的价格*(1-折扣力度)}
}class NoDiscountStrategy implements IPricingStrategy
{public NoDiscountStrategy() {} //构造函数public double getSubTotal(SaleLineItem sli) {return sli.getPro().getPrice();//直接返回价格}
}class Sale
{private ArrayList<SaleLineItem> list = new ArrayList();public Sale() {}public void addItem(SaleLineItem it) {       list.add(it);}public double getTotal() {double total =0;for(Iterator<SaleLineItem> iter = list.iterator();iter.hasNext();) {total = total + iter.next().getSubTotal();}return total;}
}

北邮JAVA高级语言程序设计(选修课)设计模式大作业相关推荐

  1. 北邮高级语言设计基于java期末_北邮《高级语言程序设计》第三次阶段作业带答案...

    一.单项选择题(共20道小题,共100.0分) 1. 下面哪个修饰符修饰的变量是所有同一个类生成的对象共享的?____ A. public B. private C. static D. final知 ...

  2. 北邮java作业代码_北邮 java 作业7 设计模式2,李颉老师的课上作业设计模式2

    [实例简介] 北邮 java 作业7 设计模式2,李颉老师的课上作业设计模式2 [实例截图] [核心代码] 67506242buptjavahomework ├── _14211133_孙杨_7_Ad ...

  3. 东华大学java_东华大学2020秋《Java程序设计》期末大作业

    东华大学继续教育学院 2020年秋季学期 远程学历教育<Java程序设计>期末大作业 一.选择题(本大题共10小题,每小题 1分, 共10分) 1.    下列哪个不是面向对象程序设计的基 ...

  4. 东华大学java_东华大学继续教育学院 2020年春季学期 远程学历教育《Java程序设计》期末大作业...

    2020年春季学期 远程学历教育<Java程序设计>期末大作业 班级            姓名           学号            成绩 项目        一        ...

  5. 设计模式大作业动物运动会系统【多种设计模式+文档】

    目录 一.项目简介 二.Design Pattern 汇总表 三.设计模式详述 3.1 Abstract Factory 3.1.1 AbstractFactoryTest 实现 API 3.1.2 ...

  6. 东北大学java期末试卷,[东北大学]18年6月考试《Java语言程序设计I》考核作业(答案)...

    Java语言程序设计 I    试 卷(作业考核 线上)  B  卷 学习中心:            院校学号:             姓名 (共        页) 总分 题号 一 二 三 四 ...

  7. 实验报告-python文库_python程序设计与实践大作业

    python程序设计与实践大作业实验报告陆阳孙勇裘升明.doc 还剩 28页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,马上远离加班 ...

  8. linux程序设计项目报告,Linux程序设计实验报告大作业

    Linux程序设计实验报告大作业 实 验 报 告 课程名称: LINUX程序设计 学 院: 计算机学院 专 业: 软件工程 班 级: 14-3 姓 名: 张正锟 学 号: 201401061038 2 ...

  9. Wireshark抓包分析微信功能----tcp/ip选修课期末大作业

    分析相关功能所抓取的数据包和完整大作业报告(word版)均已上传至Wireshark抓包分析微信功能----tcp/ip选修课期末大作业-网络监控文档类资源-CSDN文库 适合Wireshark入门的 ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露
  2. 新手算法学习之路----二叉树(二叉树最大路径和)
  3. ffmpeg为何用c语言编译,如何使用ffmpeg的c语言sdk实现对文件夹的操作
  4. 前端学习(3022):vue+element今日头条管理-首页layont布局
  5. python导入模块不在同一文件夹下_Python小技之自定义不同文件夹下模块导入问题...
  6. DOM Element对象的offsetXXX方法
  7. ExtJs2.0学习系列(11)--Ext.XTemplate
  8. 小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_41、SpringBoot定时任务schedule讲解...
  9. C语言学习——if语句
  10. Windows10 Hero默认壁纸(11色)
  11. Linux:详细的RPM和YUM/DNF管理工具,配置仓库等
  12. IMO 2017 T4解答
  13. 因果推断学习笔记三——Uplift模型
  14. centos7.6 桌面版本 网卡重启失败 记录
  15. F5负载均衡综合实例详解
  16. 第二代计算机的主要应用领域,第二代计算机的主要应用领域是啥
  17. 腾讯安全在数字生态大会内容集锦
  18. VUE3:使用复制插件出现element.hasAttribute is not a function
  19. linux 磁盘利用率过高
  20. matlab step函数的用法,matlab中step用法

热门文章

  1. 小型便携打气泵方案--【打气泵方案PCBA】
  2. 系统结构期末复习(三)流水线技术
  3. SIFT特征提取+匹配
  4. memcached在php下的应用 实验环境部署 郝铠锋
  5. 设计模式之原型模式-深浅克隆
  6. 荣耀笔记本linux隐藏分区,华为、荣耀笔记本双系统无法正常引导Windows解决办法...
  7. 一个迷惑不解的linux命令 在echo里包含 *
  8. 《鬼怪》里出现的每一个路人都有后续,心思缜密到你不服都不行?
  9. linux添加其他源,Debian添加软件源,debian添加
  10. 拉取python镜像的debian源