第1次任务-面向对象设计(购物车)
第1次任务-面向对象设计(购物车)
小组分工:
- 编码规范:叶鸿章
- 前期调查与功能设计:吴潮汇
- 面向对象设计与UML制作:张赓
- PPT制作、演示:陈伟杰
1.前期调查
2.系统功能结构图
3.系统描述
4.UML类图
5.面向对象的封装性
体现封装性的几个点:
商品类中的属性都设为private,外部无法直接访问到它的属性,只能通过getters来访问
购物车类里的查找函数findByid设为private,因为该查找函数返回的结果只服务于此类里的 增加/移除 等操作,外部没有必要访问到该函数返回值
购物车类里的移除方法removeFromMyCart返回的是boolean值,移除成功或失败都不会直接在方法里打印出类似“移除成功”“移除失败”的效果,而是返回true或false的值给外部
订单类里的评分/评论方法若直接写在商品类中,可以省去一定代码量,更加容易实现,但不符合逻辑,因为不是“商品给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次任务-面向对象设计(购物车)相关推荐
- java购物车设计_Java面向对象课程设计——购物车
Java面向对象课程设计--购物车 小组成员:余景胜.刘格铭.陈国雄.达瓦次仁 一.前期调查 流程 客人(Buyer)先在商城(Mall)中浏览商品(Commidity),将浏览的商品加入购物车(Sh ...
- 第1次任务:购物车程序的面向对象设计
小组成员及分工: 成员 任务 陈炎彬 面向对象设计.功能设计.博客制作 徐国城 前期调查.编码规范 1.前期调查与功能设计 浏览商品,需要一个商品的类,Product 把商品加入购物车,需要一个购物车 ...
- 第4次任务:购物车程序的面向对象设计
小组成员: 徐佳澎.陈俊威 任务分配 任务 成员 前期调查.博客制作.面向对象设计.功能设计. 陈俊威 面向对象设计.功能设计.编码规范. 徐佳澎 1.前期调查 本次任务要求掌握继承与多态.掌握DAO ...
- SOLID,GRASP和面向对象设计的其他基本原理
目录 介绍 单一责任原则 开放原则 利斯科夫替代原则 接口隔离原理 依赖倒置原则 好莱坞原则 多态性 信息专家 创造者 纯粹制造 控制器 优先使用组合而不是继承 间接 不要重复自己(DRY) 学习SO ...
- 面向对象设计大作业迭代任务
第0次任务:面向对象入门 目标: 学会设计简单的类(找出类的属性与方法)任务: 请完成作业03-面向对象入门中的书面作业2.1以面向对象方式改造数据结构作业"有理数"(重点). 上 ...
- 7.12 其他面向对象设计原则3: 依赖倒置原则DIP
其他面向对象设计原则3: 依赖倒置原则DIP The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...
- uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则
1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...
- 面向对象设计领域的OCP原则
一.OCP简介(OCP--Open-Closed Principle ): Software entities(classes,modules,functions,etc.) should be op ...
- 技术图文:01 面向对象设计原则
01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...
最新文章
- IIS 6和IIS 7 中设置文件上传大小限制设置方法,两者是不一样的
- 编写可维护的JavaScript之避免使用全局变量
- 一招教你舍友学会尤克里里 | 今日最佳
- 如何从几何角度上理解方程组只有一个解_深度科普---电磁波(三):无激励下的真空中的Maxwell方程组的解...
- 作者:谢华美(1976-),男,就职于中国人民银行征信中心数据部
- Linux 启动 Apache 时报错:(98)Address already in use: make_sock: could not bind to add
- sqlserver触发器如何将一个库中的数据插入到另外一个库中
- DOM 提供了一些滚动页面设置指定可见
- 如何应用Java的静态内部类
- 软件需求跟踪矩阵例子
- fatal error: google/protobuf/stubs/stringprintf.h: No such file or directory
- 电容或电感的电压_电感基础4——什么是LC电路的“谐振频率”?
- Jmeter Ant Jenkins报告优化——jmeter.results.shanhe.me模板的response和request值为空的解决方案
- 技术前沿与经典文章22:继牛顿以后最伟大的物理学家——詹姆斯·克拉克·麦克斯韦
- revit常用机电工具,如何实现管线快速翻弯
- 微信企业号开发:企业支付成功后关闭交易页面问题
- tp+layui 时间戳转换
- Ethernet(以太网) 详解 MAC、MII、PHY
- 拍照扫描怎么弄?你可以试一下这两个方法
- 1174:大整数乘法
热门文章
- R329 NASNet模型仿真测试
- 你必须要知道Mybatis中的OGNL表达式
- web前端字体居中_html里文字居中代码怎么写?_WEB前端开发
- 基于Python+Neo4j+民航数据 ,我搭建了一个知识图谱的自动问答系统
- 从零开始的Linux学习日志
- cents OS7 使用phpize安装php扩展库,生成.so文件(超详细)
- postgresql报错prepared statement ““S_84““ does not exist
- 【Matlab】蒙特卡洛算法
- iOS-多线程-(小码哥底层原理笔记)
- 当客户说“贵”时,你该怎么办?