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

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

小组分工:

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

1.前期调查

1642595-20190920120649790-774635289.png


2.系统功能结构图

1642595-20190920120739398-2133649611.jpg


3.系统描述

1642595-20190920200224965-82720490.png


4.UML类图

1642595-20190920232338850-583276332.png


5.面向对象的封装性

体现封装性的几个点:
  1. 商品类中的属性都设为private,外部无法直接访问到它的属性,只能通过getters来访问
    1642595-20190920233754014-1452485426.png

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

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

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


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

项目包结构:
1642595-20190920121057734-306054744.png

主要功能流程图:
1642595-20190920121845683-737647914.png


7.关键代码

购物车类ShoppingCart(只展示方法)
public class ShoppingCart {
    
    public void addToMyCart(Commidity commidity) { // 添加商品至购物车
        ItemEntry tem = new ItemEntry(commidity);
        int index = this.findById(commidity.getId());
        if (index == -1) { // 若购物车不存在该商品,则直接增加一条ItemEntry
            this.EntryList.add(tem);    
        } else {// 若购物车存在该商品,直接在对应ItemEntry中数量+1
            this.EntryList.get(index).increase();
        }
    }
    public boolean removeFromMyCart(int id) { // 从购物车中移除商品
        int index = this.findById(id);
        if (index == -1) { // 若购物车不存在该商品,返回false
            return 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) { //生成一条相应订单给user
        ItemEntry 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) { // 若购物车存在此商品,返回下标;若不存在,返回-1
        int 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() { // 该条目数量+1
        num++;
        this.price += this.price;//该条目总价改变
    }
    public void decrease() { // 该条目数量-1
        num--;
        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) { // 若购物车不存在该商品,则直接增加一条ItemEntry
            this.EntryList.add(tem);    
        } else {// 若购物车存在该商品,直接在对应ItemEntry中数量+1
            this.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类?

1642595-20190921001939688-1747747316.png
1642595-20190921001951417-2041114990.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值