Java任务:实现商品库和购物车类
来自CloudWiki
目录
任务描述
在网络购书系统中,需要购物车中完成用户购买或删除书籍。本任务创建商品库和购物车类,确保购物车可实现商品的购买和删除,并创建测试程序测试购物车类,完成效果如图6-1所示。 图6-1 测试程序运行结果
前期准备
goods数据库:
use cloud; CREATE TABLE `goods` ( `id` INT unsigned AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `price` FLOAT NOT NULL, `num` INT(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `gname` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /nowiki> 数据表结构: <nowiki> MariaDB [cloud]> desc `goods`; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | UNI | NULL | | | price | float | NO | | NULL | | | num | int(11) | NO | | NULL | | +-------+------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
用户和商品
为上一实训写的接口UserDao和GoodsDao向上增添业务逻辑层
业务逻辑类UserService
package service; import dao.*; import entity.*; public class UserService { /** * 用户集类(用于存储用户 */ private UserDaoMem userset = null; public UserService() { userset = new UserDaoMem(); } /** * 用于向用户集添加用户 */ public void addUser(User user){ userset.addUser(user); System.out.println("用户 "+user.getName() +" 注册成功"); System.out.println(); } /** * 查询仓库中的用户 */ public void queryUser( ){ System.out.println("本店现有如下用户:"); userset.queryUser(); System.out.println(); } /** * 登录验证,判断用户名与密码是否一致 * * @param uid 用户输入的登录账号 * @param pwd 用户输入的登录密码 * @return 登录信息有效:返回用户对象,否则返回NULL */ public boolean login(String name, String pwd){ //用户名为空,密码为空 if(!userset.hasUser(name)){ System.out.println("用户 "+name+":该用户不存在"); return false; }else if(!userset.verify(name, pwd)){ System.out.println("用户 "+name+":用户名或密码错误"); return false; } System.out.println("用户 "+name+" 登陆成功!"); return true; } }
业务逻辑类GoodsService
package service; import dao.*; import entity.*; /** * 这个类处理与商品有关的业务逻辑 */ public class GoodsService { private GoodsDao dbset ; public GoodsService() { dbset = new GoodsDaoMem(); } /** * 向数据仓库中批量添加商品 * @param goods 向仓库中添加商品(数组) * @return 值为空 */ public void addGoods(Goods [] goods){ System.out.println("现在开始向库中添加商品 "); for(int i=0;i<goods.length;i++){ this.addGoods(goods[i]); } System.out.println("所有商品添加完毕 "); System.out.println(); } /** * 向数据仓库中添加商品 * @param g 向仓库中添加的商品 * @return 值为空 */ public void addGoods(Goods g){ int num = g.getNumber(); if(dbset.hasGoods(g)){//如果该商品已经存在,则追加商品数目 dbset.modifyGoods(g, num); }else{//如果该商品不存在,则添加这个商品到数据库 dbset.addGoods(g); } System.out.println(" 商品 "+g.getName() +" 成功入库"); } /** * 向数据仓库中删除商品 * @param g 向仓库中删除的商品 * @return 值为空 */ public void delGoods(Goods g){ System.out.println("现在开始向库中删除商品 "); if(dbset.hasGoods(g)){ dbset.delGoods(g); System.out.println(g.getName()+" 已删除完毕!"); }else{ System.out.println("要删除的商品"+g.getName()+" 不存在"); } System.out.println(); } /** * 查询仓库中的商品 * * @param 值为空 * @return 值为空 */ public void queryGoods( ){ System.out.println("站点商品明细:"); System.out.println("编号\t商品名"); System.out.println("***********************"); dbset.queryGoods(); System.out.println(); } /** * 向数据仓库中修改商品的数量 * @param g 仓库中待修改的商品 * @param n 商品的数量增加或减少的数量 * @return 值为空 */ public void modifyGoods(Goods g,int n){ System.out.println("现在开始修改商品 "+g.getName()+ " 的数量"); if(!dbset.hasGoods(g)){//如果查不到这个商品 System.out.println("要删除的商品"+g.getName()+" 不存在"); }else {//查到这个商品了,可以做进一步操作 int s = g.getNumber();//该商品现在的库存数 if(n>0){//如果n>0 ,库存实际上是增加了 dbset.modifyGoods(g, n); System.out.println(g.getName()+" 的库存增加了 " + n+ " 个"); }else if(s +n >=0){//如果n<0,s+n>=0,库存实际上是减小了,但仍是正数 dbset.modifyGoods(g, n); System.out.println(g.getName()+" 的库存增加了 " + n+ " 个"); }else{//对应s +n <0的情况,要减去的数目比实际的库存数还要大,操作错误。 System.out.println(g.getName()+" 待删除数量已超过该商品库存数!"); } System.out.println(); } } }
购物车
数据接口类 CartDao
package dao; import entity.*; public interface CartDao { public void addGoods(Goods g,Integer n);//添加商品 public void delGoods(Goods g);//删除商品 public void queryGoods();//查询购物车内已放商品 public Integer hasGoods(Goods g);//查询购物车内是否已有某件商品 public void modifyGoods(Goods g,Integer num);//修改购物车内该种商品的数量 }
接口的实现类CartDaoMem
package dao; import java.util.*; import entity.Goods; public class CartDaoMem implements CartDao { private HashMap<Goods,Integer> goods = new HashMap<>(); public CartDaoMem(){ } public CartDaoMem(HashMap<Goods,Integer> goods){ this.goods= goods; } /** * 向购物车中添加商品 * @param g 向购物车中添加商品 * @return 值为空 */ public void addGoods(Goods g,Integer n){ this.goods.put(g, n); } /** * 向购物车中删除商品 * @param goods 向购物车中删除商品 * @return 值为空 */ public void delGoods(Goods g){ //将数组中myGoods条目对应的商品数量减为0 this.goods.remove(g); } /** * 遍历查询购物车中的商品 * @param 值为空 * @return 值为空 */ public void queryGoods(){ //显示所有书籍 Set<Goods> keys = goods.keySet(); //遍历keyset,通过map.get(key)方法获得value的值 for(Goods key : keys){ System.out.println(key.getName()+"\t" + goods.get(key)+"\t"+key.getPrice()); } } /** * 查询购物车中的商品 * @param mygoods 带查询的商品 * @return 该商品的数量 */ public Integer hasGoods(Goods g){ // 遍历所有的书籍信息 if(goods.containsKey(g)) return goods.get(g); return 0; } /** * 修改购物车中商品的数量 * @param g待修改的商品 * @param n 该商品要增加或减少的数量 * @return 布尔值,表明是否修改成功 */ public void modifyGoods(Goods g,Integer n){ //修改某种商品在购物车中的数目 Integer num =goods.get(g); num += n; if(num==0){//如果库存数量为0,就直接删除 goods.remove(g); }else{//如果库存数量不为0,仅仅修改它的数数量 goods.put(g,num); } } /** * 返回该类的字符串形式 * @return 返回该类的字符串形式 */ @Override public String toString() { String s=""; System.out.println("购物车商品明细:"); //显示所有书籍 Set<Goods> keys = goods.keySet(); System.out.println("编号\t商品名"); System.out.println("***********************"); //遍历keyset,通过map.get(key)方法获得value的值 for(Goods key : keys){ s +=key.toString() + "\t" + goods.get(key); } return s; } }
业务逻辑类:CartService
package service; import dao.CartDao; import dao.CartDaoMem; import entity.*; public class CartService { /** * 购物车类(用于想购买存储图书和其他商品 */ private CartDao cart = null; public CartService() { cart = new CartDaoMem(); } /** * 向购物车中添加商品 * @param goods 向仓库中添加商品(数组) * @return 值为空 */ public boolean addToCart(Goods g,Integer n){ System.out.println("现在开始向购物车中添加商品 "); if(n<=0){ System.out.println("商品数量必须大于0!"); return false; } if (g.getNumber() < n) {// 判断商品库中是否有足够书籍 System.out.println("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); return false; } Integer num=cart.hasGoods(g); if(num>0){// 购物车中有当前书籍,书籍数量+n cart.modifyGoods(g, n); }else{// 购物车中没有有当前书籍,直接+n cart.addGoods(g,n); } System.out.println("购物车中 商品 "+g.getName() +" 的数量增加了 "+n+"个"); return true; } /** * 向购物车中删除商品 * @param g 向仓库中删除商品 * @return 值为空 */ public boolean delFromCart(Goods g){ if(cart.hasGoods(g)==0){ System.out.println("要删除的商品"+g.getName()+" 在购物车中不存在"); return false; } cart.delGoods(g); System.out.println(g.getName()+" 已从购物车中清除!"); System.out.println(); return true; } /** * 向购物车中修改商品的数量 * @param goods 仓库中待修改的商品 * @param n 商品的数量增加或减少的数量 * @return 值为空 */ public boolean modifyCart(Goods g,int n){ System.out.println("现在开始修改商品 "+g.getName()+ " 的数量"); int num = cart.hasGoods(g);//num表示该商品在购物车中的数量 int sum = g.getNumber();//该商品现在在仓库中的数量 /*第1种异常:在购物车中没有这个商品*/ if(num==0){//如果查不到这个商品 System.out.println("要修改的商品"+g.getName()+" 在购物车中不存在"); return false; } //第2种异常,要更改的商品数量已经超过了商城的库存 if(num+n >sum ) { System.out.println("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); return false; } //第3种异常,要减少的商品数量比实际购物车中的数目还要大,操作错误。 if(num+n < 0 ){ System.out.println(g.getName()+" 待删除数量已超过该商品在购物车中的存数!"); return false; } if(num+n == 0) { cart.modifyGoods(g, n); System.out.println(g.getName()+"已从购物车中移除!"); return true; } cart.modifyGoods(g, n); System.out.println(g.getName()+" 的库存增加了 " + n+ " 个"); return true; } /** * 查询购物车中的商品 */ public void queryCart( ){ System.out.println("您的购物车中现有如下商品:"); System.out.println("购物车商品明细:"); //显示所有书籍 System.out.println("编号\t商品名"); System.out.println("***********************"); cart.queryGoods(); System.out.println(); } }
异常处理类
购物车异常类CartException
package exception; public class CartException extends Exception{ public CartException() { super(); } public CartException(String message) { super(message); } }
商品异常类GoodsException
package exception; public class GoodsException extends Exception{ public GoodsException() { super(); } public GoodsException(String message) { super(message); } }
用户异常类UserException
package exception; public class UserException extends Exception{ public UserException() { super(); } public UserException(String message) { super(message); } }
添加了异常处理的业务逻辑类
UserService
package service; import dao.*; import entity.*; import exception.UserException; public class UserService { /** * 用户集类(用于存储用户 */ private UserDao userset = null; public UserService() { userset = new UserDaoMem(); } /** * 用于向用户集添加用户 */ public void addUser(User user){ userset.addUser(user); System.out.println("用户 "+user.getName() +" 注册成功"); System.out.println(); } /** * 查询仓库中的用户 */ public void queryUser( ){ System.out.println("本店现有如下用户:"); userset.queryUser(); System.out.println(); } /** * 登录验证,判断用户名与密码是否一致 * * @param uid 用户输入的登录账号 * @param pwd 用户输入的登录密码 * @return 登录信息有效:返回用户对象,否则返回NULL */ public boolean login(String name, String pwd) throws UserException{ //用户名为空,密码为空 if(!userset.hasUser(name)){ throw new UserException("用户 "+name+":该用户不存在"); //System.out.println("用户 "+name+":该用户不存在"); //return false; }else if(!userset.verify(name, pwd)){ throw new UserException("用户 "+name+":用户名或密码错误"); //System.out.println("用户 "+name+":用户名或密码错误"); //return false; } System.out.println("用户 "+name+" 登陆成功!"); return true; } }
GoodsService
package service; import dao.*; import entity.*; import exception.GoodsException; /** * 这个类处理与商品有关的业务逻辑 */ public class GoodsService { private GoodsDao dbset ; public GoodsService() { dbset = new GoodsDaoMem(); } /** * 向数据仓库中批量添加商品 * @param goods 向仓库中添加商品(数组) * @return 值为空 */ public void addGoods(Goods [] goods){ System.out.println("现在开始向库中添加商品 "); for(int i=0;i<goods.length;i++){ this.addGoods(goods[i]); } System.out.println("所有商品添加完毕 "); System.out.println(); } /** * 向数据仓库中添加商品 * @param g 向仓库中添加的商品 * @return 值为空 */ public void addGoods(Goods g){ int num = g.getNumber(); if(dbset.hasGoods(g)){//如果该商品已经存在,则追加商品数目 dbset.modifyGoods(g, num); }else{//如果该商品不存在,则添加这个商品到数据库 dbset.addGoods(g); } System.out.println(" 商品 "+g.getName() +" 成功入库"); } /** * 向数据仓库中删除商品 * @param g 向仓库中删除的商品 * @return 值为空 */ public void delGoods(Goods g) throws GoodsException{ System.out.println("现在开始向库中删除商品 "); if(dbset.hasGoods(g)){ dbset.delGoods(g); System.out.println(g.getName()+" 已删除完毕!"); }else{ throw new GoodsException("要删除的商品"+g.getName()+" 不存在哦!"); //System.out.println("要删除的商品"+g.getName()+" 不存在"); } System.out.println(); } /** * 查询仓库中的商品 * * @param 值为空 * @return 值为空 */ public void queryGoods( ){ System.out.println("站点商品明细:"); System.out.println("编号\t商品名"); System.out.println("***********************"); dbset.queryGoods(); System.out.println(); } /** * 向数据仓库中修改商品的数量 * @param g 仓库中待修改的商品 * @param n 商品的数量增加或减少的数量 * @return 值为空 */ public void modifyGoods(Goods g,int n) throws GoodsException{ System.out.println("现在开始修改商品 "+g.getName()+ " 的数量"); if(!dbset.hasGoods(g)){//如果查不到这个商品 throw new GoodsException("要修改的商品"+g.getName()+" 不存在哦!"); //System.out.println("要修改的商品"+g.getName()+" 不存在"); }else {//查到这个商品了,可以做进一步操作 int s = g.getNumber();//该商品现在的库存数 if(n>0){//如果n>0 ,库存实际上是增加了 dbset.modifyGoods(g, n); }else if(s +n >=0){//如果n<0,s+n>=0,库存实际上是减小了,但仍是正数 dbset.modifyGoods(g, n); }else{//对应s +n <0的情况,要减去的数目比实际的库存数还要大,操作错误。 throw new GoodsException(g.getName()+" 待删除数量已超过该商品库存数哦!"); //System.out.println(g.getName()+" 待删除数量已超过该商品库存数!"); } System.out.println(g.getName()+" 的库存增加了 " + n+ " 个"); System.out.println(); } } }
CartService
package service; import dao.CartDao; import dao.CartDaoMem; import entity.*; import exception.CartException; public class CartService { /** * 购物车类(用于想购买存储图书和其他商品 */ private CartDao cart = null; public CartService() { cart = new CartDaoMem(); } /** * 向购物车中添加商品 * @param goods 向仓库中添加商品(数组) * @return 值为空 */ public boolean addToCart(Goods g,Integer n) throws CartException{ System.out.println("现在开始向购物车中添加商品 "); if(n<=0){ throw new CartException("商品数量必须大于0!"); } if (g.getNumber() < n) {// 判断商品库中是否有足够书籍 throw new CartException("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); //System.out.println("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); //return false; } Integer num=cart.hasGoods(g); if(num>0){// 购物车中有当前书籍,书籍数量+n cart.modifyGoods(g, n); }else{// 购物车中没有有当前书籍,直接+n cart.addGoods(g,n); } System.out.println("购物车中 商品 "+g.getName() +" 的数量增加了 "+n+"个"); return true; } /** * 向购物车中删除商品 * @param g 向仓库中删除商品 * @return 值为空 */ public boolean delFromCart(Goods g) throws CartException { if(cart.hasGoods(g)==0){ throw new CartException("要删除的商品"+g.getName()+" 在购物车中不存在哦!"); //System.out.println("要删除的商品"+g.getName()+" 在购物车中不存在"); //return false; } cart.delGoods(g); System.out.println(g.getName()+" 已从购物车中清除!"); System.out.println(); return true; } /** * 向购物车中修改商品的数量 * @param goods 仓库中待修改的商品 * @param n 商品的数量增加或减少的数量 * @return 值为空 */ public boolean modifyCart(Goods g,int n) throws CartException { System.out.println("现在开始修改商品 "+g.getName()+ " 的数量"); int num = cart.hasGoods(g);//num表示该商品在购物车中的数量 int sum = g.getNumber();//该商品现在在仓库中的数量 /*第1种异常:在购物车中没有这个商品*/ if(num==0){//如果查不到这个商品 throw new CartException("要修改的商品"+g.getName()+" 在购物车中不存在"); //System.out.println("要修改的商品"+g.getName()+" 在购物车中不存在"); //return false; } //第2种异常,要更改的商品数量已经超过了商城的库存 if(num+n >sum ) { throw new CartException("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); //System.out.println("商品:" + g.getName() + " 仅剩" + g.getNumber() + "个,无法满足您的购买需要。"); //return false; } //第3种异常,要减少的商品数量比实际购物车中的数目还要大,操作错误。 if(num+n < 0 ){ throw new CartException(g.getName()+" 待删除数量已超过该商品在购物车中的存数!"); //System.out.println(g.getName()+" 待删除数量已超过该商品在购物车中的存数!"); //return false; } if(num+n == 0) { cart.modifyGoods(g, n); System.out.println(g.getName()+"已从购物车中移除!"); return true; } cart.modifyGoods(g, n); System.out.println(g.getName()+" 的库存增加了 " + n+ " 个"); return true; } /** * 查询购物车中的商品 */ public void queryCart( ){ System.out.println("您的购物车中现有如下商品:"); System.out.println("购物车商品明细:"); //显示所有书籍 System.out.println("编号\t商品名"); System.out.println("***********************"); cart.queryGoods(); System.out.println(); } }
测试类MainClass
package main; import entity.*; import exception.CartException; import exception.GoodsException; import exception.UserException; import service.*; /*本类对应实训: 添加购物车功能(用文件实现)*/ public class MainClass { public static void main(String[] args) { // Tag t1 = new Tag(1, "纸质书籍", "软件编程"); Tag t2 = new Tag(1, "纸质书籍", "文学经典"); Tag t3 = new Tag(1, "电子产品", "学习工具"); Goods[] goods=new Goods[5]; goods[0]=new Book("01","think in java","Bruce Eckel",50.0f,50,t1); goods[1]=new Book("02","JAVA核心技术","Cay S.Horstmann",50.0f,40,t1); goods[2]=new Book("03","射雕英雄传","金庸",30.0f,30,t2); goods[3]= new Ipad("lr01","清华同方平板", 151f,10,"tf-001",t3); goods[4]= new Ipad("lr02","小米平板电脑", 151f,10,"xm-001",t3); try { GoodsService bs = new GoodsService(); //增加商品 bs.addGoods(goods); bs.queryGoods(); //删除商品 bs.delGoods(goods[2]); bs.queryGoods(); Goods newgoods=new Ipad("lr03","苹果平板电脑", 151f,50,"xm-001",t3);; //bs.delGoods(newgoods); //bs.queryGoods(); //查询商品 System.out.println("现在开始查询全库商品的信息"); bs.queryGoods(); //修改商品的库存数量 //bs.modifyGoods(newgoods,5); bs.modifyGoods(goods[3],5); bs.modifyGoods(goods[3],-5); bs.modifyGoods(goods[3],-25); bs.queryGoods(); //查询商品 }catch(GoodsException e){ System.out.println(e.getMessage()); } /*下面这些属于客户端的操作*/ /*用户有关操作*/ System.out.println("以下是消费者的操作:"); User zhang= new User("u01", "zhangyi", "123"); try { UserService us = new UserService(); us.addUser(zhang); us.queryUser(); us.login("zhanger","456"); us.login("zhangyi","456"); us.login("zhangyi","123"); }catch(UserException e){ System.out.println(e.getMessage()); } try{ Goods g1=goods[0]; Goods g2=goods[1]; Goods g3=goods[2]; CartService cs =zhang.getCart();//用户张获取购物车 //cs.addToCart(g1, -3); cs.addToCart(g1, 3); cs.addToCart(g2,3); cs.queryCart(); //cs.delFromCart(g3); cs.delFromCart(g2); cs.queryCart(); //cs.modifyCart(g3, 2); //cs.modifyCart(g1, 100); cs.modifyCart(g1, 2); cs.modifyCart(g1,-2); //cs.modifyCart(g1, -20); cs.queryCart(); cs.modifyCart(g1,-3); cs.queryCart(); }catch(CartException e){ System.out.println(e.getMessage()); } } }
返回 Java程序设计