Java设计模式 - 如何在产品和购物车上应用优惠

时间:2017-12-22 14:51:08

标签: java design-patterns

我正在开发购物车应用程序,它将输出购物车的价格。 我有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%或其他。

如何以可扩展的方式设计购物车和个别产品的这些优惠?

2 个答案:

答案 0 :(得分:1)

从您的示例中,您可能需要不同的优惠策略。在我看来,你应该通过使用接口松散地耦合所有这三个类。创建OfferStrategy和子类,如基于产品的报价,基于价格的报价等。

这也看起来可以从规则引擎中受益(您可以在不停止应用程序的情况下动态更改整个应用程序的优惠)

以下是我对设计的建议(每个类的接口,封装内部使用规则的不同Offer算法的策略): * Ixxx表示界面,&lt; - 表示关系

IOffer&lt; - Offer,IProduct&lt; - Product,IPurchase&lt; - Purchase,IOfferStragegy&lt; - OfferStrategy *(使用通用接口方法的不同实现) ICart&lt; - 购物车 购物车产品和优惠。

以下是这样做的好处/原因:

  1. 假设Offer和Offer实现将不断变化,因此需要接口和在运行时更改的能力。
  2. 购物车价格根据优惠策略确定

答案 1 :(得分:-1)

问题有点普遍,但我会尝试给你一些想法。

1)如果您还没有这样做,请使用TDD,这将有助于您改进设计,因为如果代码不可测试,那么您正在做一些不好或邋。的事情。

2)对几乎所有内容使用DI(依赖注入),避免使用新关键字。

3)不要试图预测未来,因为人类在预测变化方面非常糟糕,所以,让重复保留在那里,直到显而易见的事情需要重构。

4)在真正需要之前不要应用设计模式,原因与第3点相同

5)始终使用接口,组合和委托而不是继承。