我在为购物车应用程序设计类时有点困惑。
一个ShoppingCart
有一组ShopCartItem
s,每一个都包含Product
的一个实例和数量。ShoppingCart
实例始终存储在会话中。
如下所示,Invoice
引用了Customer
、一组ShopCartItem
、日期、发票编号和总金额。我应该如何设计Order
类?我认为它还应该包含Customer
、ShopCartItem
和日期。
我担心创建多余的类,但我想要让用户取消订单的功能,所以这需要将它们存储在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等,但为了避免类似数据的多个实例,这就是您需要做的:
-
订单应包含对关联发票的引用。然后可以在Order类中有一个方法:Order.isIInvoiceGenerated((
-
Order.addItem(ShopCartItem项目(应将项目添加到Order类和Order的关联Invoice对象中。
-
对于像Customer/ShopcartItem对象这样的东西,Invoice类不应该有直接的变量。所以发票.addItem(购物车项目(不应该被允许。
-
以上2点和3点将确保Order和Invoice对象都引用了内存中Customer/ShopCartItem的同一实例。因此,这将使它们保持一致。
-
上述设计确保,如果您的客户订单发生变化,则需要重新生成发票。如果客户取消订单,发票也必须取消。
请告诉我你对此的看法。