gpt4 book ai didi

java - java中装饰器设计模式的问题

转载 作者:行者123 更新时间:2023-12-02 12:09:55 25 4
gpt4 key购买 nike

我尝试在这里使用装饰器模式。 BaseCart 是抽象类。 Cart 扩展了 BaseCart 并获取总价。现在我想在不更改现有代码的情况下对购物车总值(value)给予折扣。因此,我创建了扩展 BaseCart 的 CartDecorator,然后创建了 TotalDiscountCart,它将获取总金额,然后对其应用折扣。

现在我尝试运行下面给出的单元测试,但没有给出正确的输出。产品已添加到购物车中,但当调用 Cart 的 getTotalPrice() 方法时,productsWithQuantity 为空。难道不应该有附加值吗?为什么是空的,如何解决?

    public abstract class BaseCart {


Map<Product, Integer> productsWithQuantity = new HashMap<Product, Integer>();
Double totalPrice = 0.0;

public void addProduct(Product product, Integer quantity){
productsWithQuantity.put(product, quantity);
}

public abstract Double getTotalPrice();
}


public class Cart extends BaseCart{

@Override
public Double getTotalPrice() {
productsWithQuantity.forEach((product ,quantity )-> totalPrice = totalPrice + product.getUnitPrice() * quantity);
return totalPrice;
}


}


public class CartDecorator extends BaseCart{

BaseCart cart;

public CartDecorator(BaseCart cart) {
super();
this.cart = cart;
}

@Override
public Double getTotalPrice() {
return this.cart.getTotalPrice();
}

}

public class TotalDiscountCart extends CartDecorator{

public TotalDiscountCart(BaseCart cart) {
super(cart);
}

@Override
public Double getTotalPrice() {
super.getTotalPrice();
return totalPrice - (percentDiscount(10.0));

}

private Double percentDiscount(Double i) {
return 0.1 * totalPrice;
}


}

@Test
public void shouldGiveDiscountOf9() {
//Given
BaseCart cart = new TotalDiscountCart(new Cart());

Product productDove = new Product("Dove soap", 30.0);

//when
cart.addProduct(productDove, 3);

// then
assertEquals(Double.valueOf(81.0),cart.getTotalPrice());
}

最佳答案

您应该将 addProduct 委托(delegate)给 CartDecorator 中的 cart。创建一个 Cart 接口(interface)也可能是有意义的,因为 CartDecorator 不会从子类化 BaseCart 中获益。

Can you please elaborate this 'create a Cart interface as CartDecorator does not profit from subclassing BaseCart.'?

你的BaseCart实际上做了两件事。一是定义一个使用购物车的接口(interface)(由 addProductgetTotalPrice 方法组成)。另一个是为 addProduct 提供基本实现,它填充 productsWithQuantity 映射。

现在,CartDecorator 装饰另一个购物车。它(当然)应该实现与所有购物车相同的接口(interface)。但对于 CartDecorator 来说,从 BaseCart 继承 addProduct 实现实际上会适得其反。因为 CartDecorator 可以将 addProduct 委托(delegate)给装饰后的购物车 - 所以它实际上不需要自己的 productsWithQuantity 映射等。

这就是为什么定义 Cart 接口(interface)可能有意义,如果您认为需要它,那么可以使用像 BaseCart 这样的基本抽象实现。然后,CartDecorator 将实现 Cart 接口(interface),但不会扩展 BaseCart

关于java - java中装饰器设计模式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46623113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com