67,538
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
import java.util.HashMap;
public class ShoppingCart {
//private ShoppingCart shoppingCart = null;
//使用HashMap聚集管理所有的实例;
private static HashMap<String, ShoppingCart> instanse = new HashMap<String, ShoppingCart>();
//订单列表
private ArrayList<ItemOrder> orderedItems = null;
//更新器
private int readCount = 0;
/**
*同单例类一样,私有的构造函数保证外界无法直接将此类实例化
*
*/
private ShoppingCart() {
}
/*
*获取购物车,一个用户只能有一个购物车。有多少用户就有多少购物车。
* @para user :为用户登陆的用户名。
* */
public synchronized static ShoppingCart getInstance(String user) {
ShoppingCart shoppingCart = instanse.get(user);
if (shoppingCart == null){
shoppingCart = new ShoppingCart();
instanse.put(user, shoppingCart);
}
return shoppingCart;
}
/*
* 用户退出登陆的时候,通过外部调用将购物车移除。
* */
public synchronized void removeShoppingCart(String key){
instanse.remove(key);
}
/*
* 获取购物车中订单列表(orderedItems)
* */
public ArrayList<ItemOrder> getOrderedItems() {
readIn();
readOut();
return orderedItems;
}
/*
* 管理订单。
* 如果是旧订单则更新其数量。
* 如果是新订单则添加到订单列表中。
* */
public void addItem(String itemId){
updateIn();
ItemOrder order;//订单类,维护一个订单。成员有商品类和数量。
for(int i=0; i<orderedItems.size(); i++) {
order = (ItemOrder)orderedItems.get(i);
if ((order.getItem().getItemID()).equals(itemId)) {
order.incrementNumItems();//如果是旧订单则更新其数量,为维持订单类订单数量的一个方法。
return;
}
}
ItemOrder newOrder = new ItemOrder(Catalog.getItem(itemId), 1);
orderedItems.add(newOrder);
}
/*
* 管理订单数量。
* 如果是旧订单,其数量为0则移除该订单,否则更新其数量。
* 如果是新订单,则添加到订单列表中。
* */
public synchronized void setNumOrdered(String itemId,int numOrdered){
updateIn();
ItemOrder order;
for(int i=0; i<orderedItems.size(); i++) {
order = (ItemOrder)orderedItems.get(i);
if ((order.getItem().getItemID()).equals(itemId)) {
if (numOrdered <= 0) {
orderedItems.remove(i);
} else {
order.setNumItems(numOrdered);//如果是新订单,则添加到订单列表中。
}
return;
}
}
ItemOrder newOrder = new ItemOrder(Catalog.getItem(itemId), 1);
orderedItems.add(newOrder);
}
/*更新器,维护数据读写的同步*/
private synchronized void updateIn() {
while (readCount > 0) {
try {
wait();
} catch (Exception e) {
}
}
}
private synchronized void readIn() {
readCount++;
}
private synchronized void readOut() {
readCount--;
notifyAll();
}
}