第1次任务-面向对象设计(购物车)

小组分工:

  • 编码规范:叶鸿章
  • 前期调查与功能设计:吴潮汇
  • 面向对象设计与UML制作:张赓
  • PPT制作、演示:陈伟杰

1.前期调查


2.系统功能结构图


3.系统描述


4.UML类图


5.面向对象的封装性

体现封装性的几个点:

  1. 商品类中的属性都设为private,外部无法直接访问到它的属性,只能通过getters来访问

  2. 购物车类里的查找函数findByid设为private,因为该查找函数返回的结果只服务于此类里的 增加/移除 等操作,外部没有必要访问到该函数返回值

  3. 购物车类里的移除方法removeFromMyCart返回的是boolean值,移除成功或失败都不会直接在方法里打印出类似“移除成功”“移除失败”的效果,而是返回true或false的值给外部

  4. 订单类里的评分/评论方法若直接写在商品类中,可以省去一定代码量,更加容易实现,但不符合逻辑,因为不是“商品给XX评分评论”,而是“用户通过订单对商品评分评价”


6.项目包结构与主要功能流程图

项目包结构:

主要功能流程图:


7.关键代码

购物车类ShoppingCart(只展示方法)

public class ShoppingCart {public void addToMyCart(Commidity commidity) { // 添加商品至购物车ItemEntry tem = new ItemEntry(commidity);int index = this.findById(commidity.getId());if (index == -1) { // 若购物车不存在该商品,则直接增加一条ItemEntrythis.EntryList.add(tem);    } else {// 若购物车存在该商品,直接在对应ItemEntry中数量+1this.EntryList.get(index).increase();}}public boolean removeFromMyCart(int id) { // 从购物车中移除商品int index = this.findById(id);if (index == -1) { // 若购物车不存在该商品,返回falsereturn false;} else { // 若购物车存在该商品if (this.EntryList.get(index).getNum()>1) {this.EntryList.get(index).decrease();// 该商品选中数量>1,则对应ItemEntry数量-1} else {this.EntryList.remove(index);// 该商品选中数量=1,则直接移除对应ItemEntry}return true;}}/*public void showMyCart() { // 展示购物车for(ItemEntry now:EntryList) {System.out.println(now.toString());}}*/public ArrayList<ItemEntry> showMyCart() { // 展示购物车return this.EntryList;}public double countTotalPrice() { //计算购物车中所有商品的总价for(ItemEntry now:EntryList) {totalPrice += now.getPrice();}return this.totalPrice;}public void generateOrder(int index) { //生成一条相应订单给userItemEntry tem = this.EntryList.get(index);Order order = new Order(tem);user.getOrderList().add(order);this.totalPrice -= tem.getPrice();//购物车总价减去该订单价格this.EntryList.remove(index);//购物车中移除该商品条目}private int findById(int id) { // 若购物车存在此商品,返回下标;若不存在,返回-1int index = -1;if ( this.EntryList.size()>0) {for(int i = 0; i<this.EntryList.size();i++) {if ( this.EntryList.get(i).getItem().getId() == id) {index = i;break;}}}return index;}
}

商品条目类ItemEntry(省略setter/getter)

public class ItemEntry {// 所选商品的信息private Commidity commidity;//商品类,存该商品基本信息private double price;//该商品选中数量的总价private int num;//该商品选中数量public ItemEntry(Commidity commidity){this.price = commidity.getPrice();}public void increase() { // 该条目数量+1num++;this.price += this.price;//该条目总价改变}public void decrease() { // 该条目数量-1num--;this.price -= this.price;//该条目总价改变}}

类功能一览:

  • Mall

    • 存放所有商品
    • 展示所有商品
    • 移除指定商品
    • 通过id查找商品,查找成功返回下标,否则返回-1
  • Commidity

    • 初始化商品id编号
    • 存放商品id,库存,单价,买家评分,买家评论
  • ItemEntry

    • 存放指定商品所选中的数量及选中的数量总价
    • 增加/减少 指定商品选中的数量(1个)
  • ShoppingCart

    • 存放购物车中商品总价,所选中的商品条目,以及使用该购物车的用户
    • 添加商品至购物车,若该商品不在购物车则新增加一条商品条目,若存在则数量+1
    • 移除商品,若商品不存在则返回false,若存在且数量>1则数量-1,若存在且数量=1则删除该商品条目,并返回true
    • 展示购物车中所有商品
    • 算出购物车中商品总价
    • 生成一条相应订单给用户
    • 通过id在购物车内查找商品,查找成功返回下标,否则返回-1
  • User

    • 存放用户地址和订单
    • 增加/删除 地址
    • 展示所有订单
    • 删除某条订单
  • Order

    • 存放商品条目和订单号
    • 自动生成该条订单的订单号
  • Address

    • 存放地址的省,市,镇

问题补充:

1.addToMyCart 返回值用void是否合适?

public void addToMyCart(Commidity commidity) { // 添加商品至购物车ItemEntry tem = new ItemEntry(commidity);int index = this.findByid(commidity.getId());if (index == -1) { // 若购物车不存在该商品,则直接增加一条ItemEntrythis.EntryList.add(tem);    } else {// 若购物车存在该商品,直接在对应ItemEntry中数量+1this.EntryList.get(index).increase();}}
  • addToMyCart(commidity)返回值是void而不是boolean,我们的想法是因为传入的参数commidity就是一个商城中有的商品,所以一定能添加成功,不用判断添加成功或失败而返回true或false,只要判断购物车中是否含有这个商品,如果有就向相应的ItemEntry数量+1,无则向购物车中新增一条新的ItemEntry。一开始有想法让返回值是int,若购物车有此商品返回1,若无返回2,但后来考虑到在前端调用该增加方法时,不论返回1或2,对于用户的结果都是“添加成功”,便还是让返回值是void

2.showMyCart耦合到控制台,看看如何解耦?

        /*public void showMyCart() { // 未更改版本的展示购物车for(ItemEntry now:EntryList) {System.out.println(now.toString());}}*/public ArrayList<ItemEntry> showMyCart() { // 更改后的展示购物车return this.EntryList;}
  • 耦合我个人的理解是函数之间有相互的联系,解耦就是去弱化这种关系,把方法写得独立点,以免要改一个方法需要触及到其他方法。在这里解耦的方式我们选择不在方法里直接输出,而是直接将购物车中的EntryList返回给前端,让前端去对其进行输出

3.为什么要ItemEntry类?


  • 购物车中的商品,应该包括商品的名称,单价,以及选中的数量(添加至购物车中的件数),选中数量的总价。而原本的商品Commidity类存的是一个商品的基本信息(名称,单价,评分等),因为逻辑上对于一个商品来说,商品并不存在“被选中多少个,一共多少钱”的属性,所以设计了商品条目ItemEntry类,里面除了存放该商品的基本属性外,还放了商品数量、该条目商品总价

转载于:https://www.cnblogs.com/damao33/p/11556203.html

第1次任务-面向对象设计(购物车)相关推荐

  1. java购物车设计_Java面向对象课程设计——购物车

    Java面向对象课程设计--购物车 小组成员:余景胜.刘格铭.陈国雄.达瓦次仁 一.前期调查 流程 客人(Buyer)先在商城(Mall)中浏览商品(Commidity),将浏览的商品加入购物车(Sh ...

  2. 第1次任务:购物车程序的面向对象设计

    小组成员及分工: 成员 任务 陈炎彬 面向对象设计.功能设计.博客制作 徐国城 前期调查.编码规范 1.前期调查与功能设计 浏览商品,需要一个商品的类,Product 把商品加入购物车,需要一个购物车 ...

  3. 第4次任务:购物车程序的面向对象设计

    小组成员: 徐佳澎.陈俊威 任务分配 任务 成员 前期调查.博客制作.面向对象设计.功能设计. 陈俊威 面向对象设计.功能设计.编码规范. 徐佳澎 1.前期调查 本次任务要求掌握继承与多态.掌握DAO ...

  4. SOLID,GRASP和面向对象设计的其他基本原理

    目录 介绍 单一责任原则 开放原则 利斯科夫替代原则 接口隔离原理 依赖倒置原则 好莱坞原则 多态性 信息专家 创造者 纯粹制造 控制器 优先使用组合而不是继承 间接 不要重复自己(DRY) 学习SO ...

  5. 面向对象设计大作业迭代任务

    第0次任务:面向对象入门 目标: 学会设计简单的类(找出类的属性与方法)任务: 请完成作业03-面向对象入门中的书面作业2.1以面向对象方式改造数据结构作业"有理数"(重点). 上 ...

  6. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  7. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  8. 面向对象设计领域的OCP原则

    一.OCP简介(OCP--Open-Closed Principle ): Software entities(classes,modules,functions,etc.) should be op ...

  9. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

最新文章

  1. IIS 6和IIS 7 中设置文件上传大小限制设置方法,两者是不一样的
  2. 编写可维护的JavaScript之避免使用全局变量
  3. 一招教你舍友学会尤克里里 | 今日最佳
  4. 如何从几何角度上理解方程组只有一个解_深度科普---电磁波(三):无激励下的真空中的Maxwell方程组的解...
  5. 作者:谢华美(1976-),男,就职于中国人民银行征信中心数据部
  6. Linux 启动 Apache 时报错:(98)Address already in use: make_sock: could not bind to add
  7. sqlserver触发器如何将一个库中的数据插入到另外一个库中
  8. DOM 提供了一些滚动页面设置指定可见
  9. 如何应用Java的静态内部类
  10. 软件需求跟踪矩阵例子
  11. fatal error: google/protobuf/stubs/stringprintf.h: No such file or directory
  12. 电容或电感的电压_电感基础4——什么是LC电路的“谐振频率”?
  13. Jmeter Ant Jenkins报告优化——jmeter.results.shanhe.me模板的response和request值为空的解决方案
  14. 技术前沿与经典文章22:继牛顿以后最伟大的物理学家——詹姆斯·克拉克·麦克斯韦
  15. revit常用机电工具,如何实现管线快速翻弯
  16. 微信企业号开发:企业支付成功后关闭交易页面问题
  17. tp+layui 时间戳转换
  18. Ethernet(以太网) 详解 MAC、MII、PHY
  19. 拍照扫描怎么弄?你可以试一下这两个方法
  20. 1174:大整数乘法

热门文章

  1. R329 NASNet模型仿真测试
  2. 你必须要知道Mybatis中的OGNL表达式
  3. web前端字体居中_html里文字居中代码怎么写?_WEB前端开发
  4. 基于Python+Neo4j+民航数据 ,我搭建了一个知识图谱的自动问答系统
  5. 从零开始的Linux学习日志
  6. cents OS7 使用phpize安装php扩展库,生成.so文件(超详细)
  7. postgresql报错prepared statement ““S_84““ does not exist
  8. 【Matlab】蒙特卡洛算法
  9. iOS-多线程-(小码哥底层原理笔记)
  10. 当客户说“贵”时,你该怎么办?