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

Java设计模式-如何在产品和购物车上应用优惠,java,design-patterns,Java,Design Patterns,我正在开发一个购物车应用程序,它将输出购物车的价格。 我有三个类,购物车,产品 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 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;
    }


}
公共类产品{
私有int-id;
私有字符串名称;
私人双价;
要约;
//吸气剂设定器
公共双倍价格(整数数量){
返回报价。获取价格。。。。
}
}
公共类购买{
产品;
整数;
//吸气剂设定器
公开双价{
返回产品。获取价格(数量);
}
}
公共类购物车{
列表购买=新建ArrayList();
要约;
整数忠诚点数;
//吸气剂设定器
公共双getTotal(){
双倍合计=0;
用于(采购:采购){
合计+=采购。getPrice();
}
双倍最终价格=报价。获取价格(总计,。。。。;
返回最终价格;
}
}
如上所示,单个产品可以有优惠,购物车也可以有优惠

起初,我想到了一家工厂。 OfferPrice可以是抽象类&它的子类可以是buyonegetoneprice、buytwogetoneprice、50PrecentOnOffPrice,但buyonegetoneprice的输入将是数量,而50PrecentOnOffPrice的输入和价格是唯一的价格

这意味着有两种不同的方法,但OfferPrice的实现者只关注一种实现

此外,购物车上的优惠是什么样子的?购物车上的优惠可以基于客户忠诚度点数或50%折扣或其他


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

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

这看起来还可以从规则引擎中获益(您可以动态更改整个应用程序的报价,而无需停止应用程序)

以下是我的设计建议(每个类的接口,封装内部使用规则的不同提供算法的策略): *Ixxx代表接口,