Java面向對象課程設計——購物車


Java面向對象課程設計——購物車

小組成員:余景勝、劉格銘、陳國雄、達瓦次仁

一、前期調查

流程

客人(Buyer)先在商城(Mall)中瀏覽商品(Commidity),將瀏覽的商品加入購物車(Shopping Cart),最后通過購物車生成訂單(Order),在購買時填寫顧客地址信息(address),購買結束。

二、購物車

1.圖表

業務流程圖

功能結構圖

UML圖

2.包

包結構

3.類

(代碼中均省略了自動生成的getter/setter)

Mall

代碼
public class Mall {// 商場
    private List<Commodity> commodities = new ArrayList<>();
    {                                      // 初始化商品
        commodities.add(new Commodity("耐克 AJ1 GS", 3999, 1, "shoes"));
        commodities.add(new Commodity("OnePlus 6", 3599, 2, "phone"));
        commodities.add(new Commodity("蘋果iPhone XS", 8699, 3, "phone"));
        commodities.add(new Commodity("聯想拯救者Y7000", 7499, 4, "computer"));
        commodities.add(new Commodity("森馬T恤", 65.9, 5, "cloth"));
        commodities.add(new Commodity("匡威男式板鞋", 419.0, 6, "shoes"));
        commodities.add(new Commodity("七匹狼休閑褲", 278, 7, "cloth"));
        commodities.add(new Commodity("黑人牙膏", 13.9, 8, "dailylife"));
        commodities.add(new Commodity("黑人牙刷", 15.9, 9, "dailylife"));
        commodities.add(new Commodity("戴爾靈越367", 5099, 10, "computer"));
    }
    public List<Commodity> showGoods() {// 展示商品
       return this.commodities;
    }
    public Commodity searchGoodById(int id) {// 按編號搜索商品
        int i = 0, flag = 1;
        for (i = 0; i < commodities.size(); i++) {
            if (commodities.get(i).getId() == (id)) {
                return commodities.get(i);
            }
        }
        if (flag == 1)
            System.out.println("對不起,您要找的商品我們沒有");
            return null;
    }

    public List<Commodity> searchGoodsByType(String type) {// 按類型搜索商品
        int i = 0;
        List<Commodity> list = new ArrayList<>();
        for (i = 0; i < commodities.size(); i++) {
            if (commodities.get(i).getType().equals(type)) {
                list.add(commodities.get(i));
            }
        }
        return list;
    }

}
 
         
         
        
功能:
  • 默認開始對商城進行初始化
  • 展示商城所有商品
  • 輸入編號搜索商品,並將商品信息輸出;反之則輸出無法找到相應商品
  • 輸入類型搜索商品,將該類商品全部輸出;不存在則直接輸出不存在

Commodity

代碼
public class Commodity {//商品
    private String name;
    private double price;
    private Integer id;
    private String type;
    public Commodity(String name, double price, Integer id, String type) {        
        this.name = name;
        this.price = price;
        this.id = id;
        this.type = type;
    }
    public Commodity() {
        
    }

 

功能:
  • 存儲商品信息 :姓名 價格 編號 種類

ShoppingCart

代碼
方法部分
public class ShoppingCart {
    private List<ItemEntry> itemList = new ArrayList<>();

    public void addToCart(Commodity e) {

        int index = findById(e.getId());
        if (index == -1) {
            itemList.add(new ItemEntry(e));

        } else {
            itemList.get(index).increase();
        }
    }

    public List<ItemEntry> getItemList() {
        return itemList;
    }
    public List<ItemEntry> emptyCart(){
        itemList.clear();
        return itemList;
    }
    public List<ItemEntry> seeMyCart() {
        return itemList;
    }

    public Order putInOrder() {
        Order ord = new Order();
        ord.setOrderList(itemList);
        return ord;
    }

    public boolean remove(Integer id) {
        if (id == null)
            return false;
        int index = findById(id);
        if (index == -1) {// 未找到
            return false;
        } else {
            ItemEntry entry = this.itemList.get(index);
            if (entry.getPiece() <= 1) {
                this.itemList.remove(index);
            } else {
                entry.decrease();
            }
        }
        return true;
    }

    private int findById(Integer id) {
        int index = -1;
        if (itemList.size() > 0) {
            for (int i = 0; i < itemList.size(); i++) {
                if (itemList.get(i).getItem().getId() == id)
                    index = i;
            }
        }
        return index;
    }

 

ShoppingCart的內部類ItemEntry
public class ItemEntry {
        Commodity item;
        Integer piece;

        public ItemEntry(Commodity item) {
            this.item = item;
            piece = 1;
        }
        
        public void increase() {
            piece++;
        }

        public void decrease() {
            piece--;
        }
        /*......*/ 
        public String toString() {
            return "ItemEntry [item=" + item + ", piece=" + piece + "]";
        }

    }
}

 

功能:
  • 添加商品到購物車:若不存在則添加新商品;若存在則在已有的數量上加一
  • 查看購物車商品清單
  • 清空購物車
  • 查看商品列表
  • 生成訂單:將購物車中的商品穿給訂單類
  • 按編號刪除商品:若商品存在且數量不為一,則數量減一;若數量為一,則商品刪除;若商品不存在則返回false
  • 找到輸入編號的商品:若存在則返回其在List中的位置,否則返回-1;

內置類ItemEntry

  • 存儲購物車中條目:商品 數量
  • 初始化新加入的商品,數量默認為一
  • 操作商品數量
  • 輸出條目信息

Order

代碼
public class Order {
    private Buyer buyer;
    private List<ItemEntry>orderList=new ArrayList<>() ;
    private String orderId;
    
    public List<ItemEntry> checkOrder() {
        if(orderList.size()>0) {
            return orderList;
        }else {
            return null;
        }    
    }
    public String getOrderId() {
        return orderId;
    }
    public void setOrderId() {
        int x=new Random().nextInt(100);
        this.orderId = "   "+x;
    }
    /*......*/

 

功能:
  • 檢查購物車中是否存在商品
  • 生成訂單信息

Buyer

代碼
public class Buyer {
    private  String name;
    private  int zip;
    private  String tel;
    private  String email;
    private Address address;
      public Buyer allImformation(Buyer you) {
          return you;
      }    
      /*......*/

 

功能:
  • 存儲買家相關信息

Address

代碼
public class Address {
    private String city;
    private String street;
    private String location;
    /*.......*/

 

功能:
  • 存儲地址信息

4.實現思路

簡易購物車系統具體功能設計:

1、商城功能:包括所有上架商品展示、按類型查找商品和被選定商品詳細信息展示。

2、購物車功能:包括選定商品到購物車,查看、清空購物車以及從購物車刪除某商品。

3、訂單功能:包括獲取購物車的信息以及獲取購買者的一些聯系信息,最后就是結賬了。

簡易購物車系統的面向對象(這里只體現在封裝上)

眾所周知,JAVA是面向對象的編程語言,所以我們在設計類以及方法的時候不能只看重功能可行性,更重要的是要符合邏輯。舉個例子,對於訂單與購物車,如果不考慮符不符合邏輯,讓訂單直接繼承自購物車的話就很簡單,可以省去不少代碼,但是考慮到類的繼承必須要符合“is-a”的邏輯關系,而顯然訂單並不是一個購物車,因此這個設計並不符合邏輯,僅僅是實現了功能而已。因此,在設計的時候,訂單並不能繼承自購物車。

以下幾點為設計的幾個小原則:

  1. 方法與類必須有內在聯系    

比如查詢商品的方法就是在商城類定義,而不能在商品類。這樣才符合設計的邏輯,也方便別人想查找某個方法的時候能夠一下就想到在哪里。

  1. 有關信息的輸入輸出,全在菜單(即主函數)內實現;業務類方法只返回對象 

     其一,這樣輸入輸出都在菜單進行,而其他為業務的方法則在所對應的類里面,使得方法看着簡潔美觀且邏輯性強。其二,這樣在菜單獲取信息的時候只需知道該業務類方法返回的對象然后被可信對象操作即可,不用知道其他,這樣就能對外部環境隱藏該方法的內部工作方式,提高了代碼的模塊性,且防止了對象之間不良的相互影響,實現對方法的封裝。

三、git鏈接

https://gitee.com/WoMingZiShiGeZiBuXinNiShu/OnlineShop/tree/master/ShoppingSystem


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM