jakarta ee-在JavaEE购物车应用程序中设计订单和发票所需的帮助



我在为购物车应用程序设计类时有点困惑。

一个ShoppingCart有一组ShopCartItems,每一个都包含Product的一个实例和数量。ShoppingCart实例始终存储在会话中。

如下所示,Invoice引用了Customer、一组ShopCartItem、日期、发票编号和总金额。我应该如何设计Order类?我认为它还应该包含CustomerShopCartItem和日期。

我担心创建多余的类,但我想要让用户取消订单的功能,所以这需要将它们存储在DB中。

public class Invoice {
    private Long invoiceId;
    private Customer customer;
    private Set<ShopCartItem> shopCartItems;
    private Date invoiceDate;
    private int invoiceNum;
    private float totalAmount;
    private boolean isProcessed;
...
}
class Product{
    private String name;
    private double price;
    ...
}
class ShopCartItem{
    private Product product;
    private int quantity;
    ...
}

我在OO设计方面没有太多经验,但这是我的两分钱:

我会将shopCartItems移到Order,并在那里放置Customer引用和Invoice引用。Invoice可以具有Set<Order>或单个引用,并保留其当前拥有的其他成员(shopCartItems除外(。

首先,确切的答案取决于发票和订单类之间的关系。但让我假设一个订单总是只生成一张发票。另一方面,发票可以与许多订单相关联。

假设您可以在Order和Invoice类中都存在所有客户数据、shopcartItem等,但为了避免类似数据的多个实例,这就是您需要做的:

  1. 订单应包含对关联发票的引用。然后可以在Order类中有一个方法:Order.isIInvoiceGenerated((

  2. Order.addItem(ShopCartItem项目(应将项目添加到Order类和Order的关联Invoice对象中。

  3. 对于像Customer/ShopcartItem对象这样的东西,Invoice类不应该有直接的变量。所以发票.addItem(购物车项目(不应该被允许。

  4. 以上2点和3点将确保Order和Invoice对象都引用了内存中Customer/ShopCartItem的同一实例。因此,这将使它们保持一致。

  5. 上述设计确保,如果您的客户订单发生变化,则需要重新生成发票。如果客户取消订单,发票也必须取消。

请告诉我你对此的看法。

最新更新