我正在开发购物车应用程序,它将输出购物车的价格。 我有3个课程,这个购物车,购买,产品
public class Product {
private int id;
private String name;
private double price;
Offer offer;
// getter setter
public double getPrice(int quantity) {
return offer.getPrice....
}
}
public class Purchase {
Product product;
int quantity;
// getter setter
public double getPrice() {
return product.getPrice(quantity);
}
}
public class Cart {
List<Purchase> purchase = new ArrayList<Purchase>();
Offer offer;
Integer loyalityPoints;
//getter setter
public double getTotal(){
double total = 0;
for (Purchase purchase : purchase) {
total += purchase.getPrice();
}
double finalPrice = offer.getPrice(total,....;
return finalPrice;
}
}
如上图所示,个别产品可以提供,购物车也可以提供。
最初我想过提供工厂。 OfferPrice可以是抽象类&amp;它的孩子可能是buyonegetoneprice,buytwogetoneprice,50precentoffprice但是然后输入buyonegetoneprice将是qunatity和价格和50precentoffprice的输入只是价格。
这意味着2种不同的方法,但OfferPrice的实现者只关注一个实现。
另外怎么可能在购物车上看起来像?购物车上的优惠可以基于顾客忠诚度积分或50%或其他。
如何以可扩展的方式设计购物车和个别产品的这些优惠?
答案 0 :(得分:1)
从您的示例中,您可能需要不同的优惠策略。在我看来,你应该通过使用接口松散地耦合所有这三个类。创建OfferStrategy和子类,如基于产品的报价,基于价格的报价等。
这也看起来可以从规则引擎中受益(您可以在不停止应用程序的情况下动态更改整个应用程序的优惠)
以下是我对设计的建议(每个类的接口,封装内部使用规则的不同Offer算法的策略): * Ixxx表示界面,&lt; - 表示是关系
IOffer&lt; - Offer,IProduct&lt; - Product,IPurchase&lt; - Purchase,IOfferStragegy&lt; - OfferStrategy *(使用通用接口方法的不同实现) ICart&lt; - 购物车 购物车有产品和优惠。
以下是这样做的好处/原因:
答案 1 :(得分:-1)
问题有点普遍,但我会尝试给你一些想法。
1)如果您还没有这样做,请使用TDD,这将有助于您改进设计,因为如果代码不可测试,那么您正在做一些不好或邋。的事情。
2)对几乎所有内容使用DI(依赖注入),避免使用新关键字。
3)不要试图预测未来,因为人类在预测变化方面非常糟糕,所以,让重复保留在那里,直到显而易见的事情需要重构。
4)在真正需要之前不要应用设计模式,原因与第3点相同
5)始终使用接口,组合和委托而不是继承。