为购物车设计TotalCost计算器

时间:2015-12-06 15:02:14

标签: oop design-patterns

在面试时我被问及我得到的反馈是我缺乏OOD技能。所以我想知道我的建议设计有什么问题。

问题陈述: 设计一个系统,帮助计算购物车中物品的总成本。 您将获得购物车折扣中的商品列表,如下例所示。该清单将包含项目或折扣,顺序很重要:

示例购物车 $ 10预订xyz,所有商品均可享受10%折扣,固定价格为20美元,下一件商品可享20%折扣,100美元衬衫,第5件类型书可享15美元折扣。

折扣类型: 所有商品均可享九折优惠 下一个项目20%的折扣 在类型书的第5项上减$ 15 (以后可以在系统中添加更多类型的折扣)

我给出的解决方案:

这是我制作的类图:  Class Diagram

这是TotalCost()算法:

public decimal TotalCost(List<CartItem> cartItems)
{
var totalCost =0.0;
var items = cartItems.where(c => c.Item!=null).Select(c.Item);
    foreach(var cartItem in cartItems)
    {
        if(cartItem.Coupon != Null)
        {
            cartItem.CouponType.CalculateDiscounts(items);
        }       
    }

    foreach(var item in items)
    {
        totalCost += item.DiscountedCost;
    }

    return totalCost;
}

2 个答案:

答案 0 :(得分:3)

在我看来,您的解决方案的主要缺陷是您的商品类正在聚合折扣类。我认为无论谁看过你的解决方案都没有继续通过这一点。

按项目折扣(优惠券)的汇总表明商品只能有一个折扣,而在您的情况下并非如此。拥有优惠券列表也不会有好处,因为他们确实推出了购物车中包含包含商品或折扣的列表。这通常表明多态性和基础(超级)类型。

他们可能寻找的解决方案看起来或多或少如下:

类层次结构 -

interface CartItem {
}

interface Product extends CartItem {
    public int price();
    public void updatePrice(int updatedPrice);
}

interface Discount extends CartItem {
    public void applyDiscount(List<CartItem> cartItems);
}

算法 -

List<CartItem> cartItems = cart.getItems();
List<Discount> discounts = extractDiscountsFromItems(cartItems);
applyDiscountsOnCartItems(discounts, cartItems);
List<Products> discountProducts = extractProductsFromItems(cartItems);
int totalAmount = calculateAmount(discountProducts);
return totalAmount;

在不支持过滤集合的语言中,您可以使用访问者模式过滤掉项目。

答案 1 :(得分:0)

  

该列表将包含项目或折扣,并且顺序很重要

从您的设计中不清楚您是如何迎合这部分问题的。我想知道问题是否暗示多态性与顺序处理相结合?像CompositeStrategy设计模式之类的东西可能是他们想要的东西吗?