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

第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) { // 若购物车不存在该商品,则直接增加一条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 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 = 0;
    }
    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() { // 添加
        num++;
        this.price += this.price;
    }
    public void decrease() { // 减少
        num--;
        this.price -= this.price;
    }

}
知识兔
计算机