将购物车以多例模式的方式实现,这样做怎么样呢?

qfs_v 2008-07-10 09:29:44
将购物车以多例模式的方式实现,这样做怎么样呢?你可能会说,把购物车交给session管理不就完了,确实,我的问题也来了:是把购物车交给session维护,还是自己使用多例模式来维护呢?在效率和操作性上有什么好坏呢?
但有一点可以确定的是,这样做可以有利于用户之间的交互。请大鸟给些建议,谢谢了。(我怀疑这样做是否画蛇添足了。)


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();
}
}
...全文
116 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
youjianbo_han_87 2008-07-15
  • 打赏
  • 举报
回复
很多方法,用session的话,缓存也行,看你对性能的要求和你服务器的配置咯
chenhongxin 2008-07-11
  • 打赏
  • 举报
回复
路过,帮顶,观注中...
qfs_v 2008-07-10
  • 打赏
  • 举报
回复
不好意思在构造器里面忘记初始化属性了。
private ShoppingCart() {
orderedItems = new ArrayList<ItemOrder>();
}

67,537

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧