• Java面向对象课程设计——购物车


     一、前期调查

    流程

    首先,用户(User)要在货架(ShelfDaoArrayListImpl)上选择自己所需要的商品(Item),然后将自己所需商品加入购物车(ShoppingCart),有些商品,除了基本的属性(商品名,商品描述,商品单价等),还有有些特殊属性,如手机(Phone)、书(Book)。 根据以上需要,我们创建了User、ShelfDao、Item、ShoppingCart、Phone、Book等类。

    根据调研,我们也在GUI界面中加入了加购后的显示商品信息以及结算功能,以及购物车页面的商品详情、单种商品数目,商品总数,商品单价总价等。

    二、系统功能结构图

    三、系统业务流程图

     四、UML类图

    五、系统描述(控制台版)

    1.文字描述

    1. 首先创建一个货架(Shelf)列表,新建一个用户(User)和一个用以临时存储商品的Item。
    2. 向货架添加(add)商品,将当前用户ID显示(showUser)在控制台,将所有商品信息显示(showShelf)在控制台,获取用户选择(getChoice)。
    3. 当用户选择“1”时,进入购物商品添加模块,显示增购提示信息(showAdd)根据用户输入的商品ID,读取(readItem)购物车列表里是否有此ID并检验,如ID不存在则反馈读取失败(showReadShelfFailMessage),如果添加成功则反馈成功提示(showSuccessMessage)。
    4. 当用户选择“2”时,进入购物车商品删除模块,显示删购提示信息(showDelete)首先展示购物车信息(printShoppingcart),根据用户输入的商品ID,读取购物车列表里是否有次ID并检验,如ID不存在则反馈读取失败,如果删除成功反馈成功提示,删除出错反馈出错提示(showOperateCartFailMessage)。
    5. 当用户选择“3”时,进入购物车展示模块,展示购物车(printShoppingcart),并暂停页面(pause)。
    6. 当用户输入“4”时,退出程序。

    2.包结构

    此包结构划分了DAO包、模型对象(model)包、主程序(shoppingcart)包、和界面设计(ui)包, 这样分类有助于后期的拓展和维护,程序运行调试,和UI界面的升级

    六、核心代码

     ShelfDao

     1 package dao;
     2 
     3 import model.Item;
     4 
     5 public interface ShelfDao {        //货架接口
     6     
     7     public boolean add(Item item);        //向货架添加商品
     8     public boolean delete(Item item);    //删除货架中的商品
     9     public void showShelf();            //展示货架
    10     public Item readItem(String id);    //读取货架上的商品
    11     
    12 }

    功能:为数组储存ShelfDaoArrayImpl和列表储存ShelfDaoArrayListImpl提供接口

    ShoppingCart

     
      1 package model;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Date;
      5 
      6 public class ShoppingCart {        //购物车类
      7 
      8     ArrayList<ItemEntry> items = new ArrayList<ItemEntry>();    //存放所选商品
      9     
     10     public boolean add(Item i) {                        //添加商品
     11         if (i == null)
     12             return false;
     13         int index = getItemById(i.getId());
     14         if (index == -1) {                                //购物车中尚无此商品,new
     15             i.setDate(new Date());
     16             items.add(new ItemEntry(i));
     17         }
     18         else {                                            //存在,商品数+1
     19             items.get(index).increase();
     20             items.get(index).getItem().setDate(new Date());
     21         }
     22         return true;
     23     }
     24     
     25     public boolean delete(Item i) {                        //删除商品
     26         if (i == null)
     27             return false;
     28         int index = getItemById(i.getId());
     29         if (index == -1)                                //不存在,提示错误信息
     30             return false;
     31         else {
     32             if (items.get(index).getNum() <= 1)            //数量减为0,remove
     33                 items.remove(index);
     34             else {                                        //够减,商品数-1
     35                 items.get(index).decrease();
     36                 items.get(index).getItem().setDate(new Date());
     37             }
     38             return true;
     39         }
     40     }
     41     
     42     private double sumPrice() {                            //计算总价
     43         double sum = 0.0;
     44         
     45         for (ItemEntry e : items) {
     46             sum += e.getNum()*e.getItem().getPrice();
     47         }
     48         return sum;
     49     }
     50     
     51     public void printShoppingcart() {                    //输出购物车所有商品
     52         int num = 0;
     53         
     54         System.out.println("您所选购所有的商品如下所示:");
     55         for (ItemEntry e : items) {
     56             System.out.println(e);
     57             num += e.getNum();
     58         }
     59         System.out.println("共"+num+"件商品, 合计"+sumPrice()+"元");
     60     }
     61     
     62     private int getItemById(String id) {                //根据id获取商品下标
     63         if (id == null)
     64             return -1;
     65         int index = 0;
     66         for (ItemEntry e : items) {
     67             if (e.getItem().getId().equals(id))
     68                 return index;
     69             index++;
     70         }
     71         return -1;
     72     }
     73     
     74     private class ItemEntry{                    //商品条目内部类
     75         
     76         Item item;            //商品
     77         Integer num;        //商品数量
     78         
     79         public ItemEntry(Item item) {
     80             this.item = item;
     81             num = 1;        //新建商品,数量为1
     82         }
     83 
     84         public Item getItem() {
     85             return item;
     86         }
     87 
     88         public void setItem(Item item) {
     89             this.item = item;
     90         }
     91 
     92         public Integer getNum() {
     93             return num;
     94         }
     95 
     96         public void setNum(Integer num) {
     97             this.num = num;
     98         }
     99 
    100         @Override
    101         public String toString() {
    102             return item.toString() + "	商品数量:" + num;
    103         }
    104         
    105         public void increase() {        //商品数+1
    106             num++;
    107         }
    108         
    109         public void decrease() {        //商品数-1
    110             num--;
    111         }
    112         
    113     }
    114     
    115 }

    功能 

    1. 购物车添加商品
    2. 删除商品
    3. 计算总价
    4. 输出购物车商品列表
    5. 判定用户输入

    ShelfDaoArrayListImpl

     1 package model;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Date;
     5 
     6 import dao.ShelfDao;
     7 
     8 public class ShelfDaoArrayListImpl implements ShelfDao {    //货架接口列表实现
     9 
    10     ArrayList<Item> shelf = new ArrayList<Item>();        //货架
    11     
    12     //g/s
    13     public ArrayList<Item> getShelf() {
    14         return shelf;
    15     }
    16 
    17     public void setShelf(ArrayList<Item> shelf) {
    18         this.shelf = shelf;
    19     }
    20 
    21     private int getItemById(String id) {        //根据id获取商品下标
    22         if (id == null)
    23             return -1;
    24         int index = 0;
    25         for (Item e : shelf) {
    26             if (e.getId().equals(id))
    27                 return index;
    28             index++;
    29         }
    30         return -1;
    31     }
    32 
    33     @Override
    34     public boolean add(Item item) {                //向货架添加商品
    35         if (item == null)
    36             return false;
    37         int index = getItemById(item.getId());
    38         if (index == -1) {                        //货架中尚无此商品,添加
    39             item.setDate(new Date());
    40             shelf.add(item);
    41             return true;
    42         }
    43         else                                     //已存在,不添加
    44             return false;
    45     }
    46     
    47     @Override
    48     public boolean delete(Item item) {            //删除货架中的商品
    49         if (item == null)
    50             return false;
    51         int index = getItemById(item.getId());
    52         if (index == -1)
    53             return false;
    54         else {
    55             shelf.remove(index);
    56             return true; 
    57         }
    58     }
    59     
    60     @Override
    61     public void showShelf() {                    //展示货架
    62         for (Item e : shelf) {
    63             System.out.println(e);
    64         }
    65     }
    66 
    67     @Override
    68     public Item readItem(String id) {            //读取货架上的商品
    69         if (id == null)
    70             return null;
    71         int index = getItemById(id);
    72         if (index == -1)
    73             return null;
    74         else 
    75             return shelf.get(index);
    76     }
    77     
    78 }

    功能:

    1. 利用列表实现商品货架功能
    2. 可增加和删除货架中的商品
    3. 展示货架
    4. 读取货架中的商品

    Item

     1 package model;
     2 
     3 import java.util.Date;
     4 
     5 public class Item {            //商品类
     6 
     7     private String name;    //商品名
     8     private String details;    //商品描述
     9     private Double price;    //商品单价
    10     private String id;        //商品唯一标识
    11     private Date date;        //最后一次更新商品信息的时间
    12 
    13     public Item(String name, String details, double price, String id) {        //构造函数
    14         this.name = name;
    15         this.details = details;
    16         this.price = price;
    17         this.id = id;
    18     }
    19 @Override
    20     public boolean equals(Object obj) {        //每件商品具有唯一标识id,id相同即为同一件商品
    21         if (this == obj)
    22             return true;
    23         if (obj == null)
    24             return false;
    25         if (getClass() != obj.getClass())
    26             return false;
    27         Item other = (Item) obj;
    28         if (id == null) {
    29             if (other.id != null)
    30                 return false;
    31         } else if (!id.equals(other.id))
    32             return false;
    33         return true;
    34     }
    35 
    36     @Override
    37     public String toString() {
    38         return "商品id:" + id + "	更新时间:" + date + "	商品名称:" + name + "	商品描述:" + details + "	单价:" + price;
    39     }
    40     
    41 }

    功能:

    1. 储存商品的各项信息,给拓展类提供继承。
    2. 判断添加的商品是否相同
    3. 重载toString

    User

     1 package model;
     2 
     3 public class User {        //用户类
     4     
     5     private String id;                //用户唯一标识id
     6     private ShoppingCart cart;        //用户的购物车
     7     
     8     public User(String id) {
     9         this.id = id;
    10         cart = new ShoppingCart();
    11     }

    功能:

    1. 储存用户ID
    2. 储存购物车信息

     七、运行展示

    • 登录界面

     

    •  菜单界面,选购商品的同时可以直观地看到购物车的内容

    • 可添加、删除、清空购物车,选择结算则显示商品详情及总价,并清空购物车

    •  功能动态展示

    八、git地址

    https://gitee.com/gitzzh20/shopping-cart/tree/master

  • 相关阅读:
    java反射详解 (转至 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html)
    DexClassLoader
    防止 apk反编译 jocky-- java混淆代码 (转至:http://my.oschina.net/f839903061/blog/72554)
    Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)
    双卡手机怎么指定SIM卡打电话
    android设备休眠
    GSON使用笔记(3) -- 如何反序列化出List
    Notepad++ 更换主题
    如何才能成为一个成功的项目经理
    项目经理是干出来的,不是学出来的;是带出来的,不是教出来的
  • 原文地址:https://www.cnblogs.com/Reaches/p/14063298.html
Copyright © 2020-2023  润新知