购物商城shopping连载(9)

11 篇文章 0 订阅

购物车模块

先看一下购物车的图片:
被外面框住的是购物车,里面的一个条目是购物项。这里提出两个概念,一个是购物车,一个是购物项,购物项组成购物车.

这里写图片描述

由上图可知,购物车是由多个购物项组成的,而且购物车是保存在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();

    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值