先看一下购物车的图片:
被外面框住的是购物车,里面的一个条目是购物项。这里提出两个概念,一个是购物车,一个是购物项,购物项组成购物车.
由上图可知,购物车是由多个购物项组成的,而且购物车是保存在session中的,每一个购物项又是由商品,数量,小计组成。
购物项:CartItem
package com.shopping.cart.entity;
import com.shopping.product.entity.Product;
public class CartItem {
private Product product; // 商品
private int count; // 数量
private double subtotal; // 小计
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public double getSubtotal() {
//小计:单价*数量
return product.getShop_price()*count;
}
//不需要手动设置小计,由getSubtotal计算
/*public void setSubtotal(double subtotal) { this.subtotal = subtotal; }*/
}
这里关于商品的小计subtotal,因为不需要人为的设置,所以可以不用生成setter方法。
而getSubtoal方法是用来前台展示小计的,所有直接在getter方法中通过数量*单价来计算得出。
Cart购物车:
购物车包含多个购物项和总计,多个购物项是一个集合,这里就有问题了,到底是用哪个集合?
Set集合:不可以。为什么不采用Set集合,因为Set是无序的,每次添加新商品到session中,列出的购物项都没有顺序,所有肯定不能用Set集合。
List集合:list集合有个好处就是有序,列表显示的时候会根据加入的顺序来显示,但是因为购物项后面有删除功能,list集合删除还得通过下标来进行删除,不是很方便,因此采用Map集合。
Cart购物车:
package com.shopping.cart.entity;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
//购物车
public class Cart {
// 购物项集合:key用来唯一表示商品id,value是购物项
// HashMap无序,LinkedHashMap有序
private Map<Long, CartItem> map = new LinkedHashMap<Long, CartItem>();
// 购物总计:
private double total;
/** * 购物车功能:方法 */
// 1.将购物项加入购物车
public void addCart(CartItem cartItem) {
/*** * 判断购物车中是否存在此购物项 存在: 数量 相加 总计:总价+购物项小计 不存在:向Map中添加购物项 总计=总计+购物项小计 */
// 获得商品的id
long pid = cartItem.getProduct().getPid();
// 判断购物车中是否已经存在该购物项
if (map.containsKey(pid)) {
// 存在
// 获得购物车中原来的购物项
CartItem cartItemExist = map.get(pid);
// 数量相加
cartItemExist.setCount(cartItemExist.getCount()
+ cartItem.getCount());
} else {
// 不存在,添加新的购物项
map.put(pid, cartItem);
}
// 设置总计
total = total + cartItem.getSubtotal();
}
// 2.移除一个购物项'
public void removeCart(long pid) {
// 将购物项移除购物车
CartItem cartItem = map.remove(pid);// 返回移除的对象
// 总计=总结-移除购物项小计
total = total - cartItem.getSubtotal();
}
// 3.清空购物车
public void clearCart() {
// 清空所有购物项
map.clear();
// 总计置为0
total = 0;
}
// 这里为了Jsp页面操作,应该提供map和total的getter方法
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public Collection<CartItem> getCartItems() {
// 1.把map中的全部value转成一个单列的集合返回 ,方便遍历
// 2.因为提供了getCartItems方法,则相当于在本类中有cartItems属性
//方法名叫getCartItems,说明Cart对象中有一个叫cartItems的属性
return map.values();
}
}
1.Map集合的key代表商品的id,value表示购物项,用户可以通过key来删除这个购物项。
2.total表示所有购物项的总计。
3.根据购物车的功能来看,购物车的功能有:
(1)添加一个购物项到购物车
(2)删除一条购物项
(3)清空整个购物车并设置总金额为0
我们先从简单的方法入手:情况整个购物车,因为购物车是多个购物项的map集合,因此只需清空整个map集合就可以,通过map.clear()方法就可以完成,而设置总金额为0 ,则令total= 0 即可。对应的代码是:
// 3.清空购物车
public void clearCart() {
// 清空所有购物项
map.clear();
// 总计置为0
total = 0;
}
ok,现在我们进行对删除一条购物项方法的书写,要删除一条购物项其实很简单,通过map.remove(pid)就可以删除,remove方法传的是Map集合的key值,即商品的pid。清空这个商品还不算完,清空这个商品,还要设置总金额也的减去这个商品的小计:total= total-这个移除的商品的小计.
看代码:
public void removeCart(long pid) {
// 将购物项移除购物车
CartItem cartItem = map.remove(pid);// 返回移除的对象
// 总计=总结-移除购物项小计
total = total - cartItem.getSubtotal();
}
这里说下为什么remove掉一个购物项还要返回这个对象,这里的cartItem就表示移除掉的对象,而总金额正好要减去这个对象的小计,完全是为了总金额执行方便。
添加到购物车:
添加到购物车的时候需要判断这个商品,在map中是否已经存在,如果已经存在则在数量上增加,如果不存在则添加新的购物项到购物车中。
因为要添加一个购物项到购物车,所以这个方法中需要传一个购物项的参数,而这个购物项又可以通过long pid = cartItem.getProduct().getPid();来找到这个商品的id,然后在map中通过map.containsKey(pid)来判断这个id是否存在,如果存在证明这个商品已经有了,即这个购物项存在,则只需要在数量上增加即可,如果不存在,则向map中添加新的购物项。
public void addCart(CartItem cartItem) {
// 获得商品的id
long pid = cartItem.getProduct().getPid();
// 判断购物车中是否已经存在该购物项
if (map.containsKey(pid)) {
// 存在
// 获得购物车中原来的购物项
CartItem cartItemExist = map.get(pid);
// 数量相加
cartItemExist.setCount(cartItemExist.getCount()
+ cartItem.getCount());
} else {
// 不存在,添加新的购物项
map.put(pid, cartItem);
}
// 设置总计
total = total + cartItem.getSubtotal();
}
关于map集合和总计total的setter、getter方法的说明,total方法提供setter,getter方法没问题。但是map集合提供setter和getter集合在前台不好遍历,就不如list集合这种单列的集合好遍历,那怎么办呢?Map集合提供了values方法来把所有value转出一个单列的集合输出,这个方法返回是Collection
public Collection getCartItems() {
// 1.把map中的全部value转成一个单列的集合返回 ,方便遍历
// 2.因为提供了getCartItems方法,则相当于在本类中有cartItems属性
//方法名叫getCartItems,说明Cart对象中有一个叫cartItems的属性
return map.values();
}