2017-10-07 63 views
0

我想在這裏使用裝飾模式。 BaseCart是抽象類。購物車擴展了BaseCart並獲得總價。現在我想在不改變現有代碼的情況下給予總購物車價值的折扣。所以我創建了擴展BaseCart的CartDecorator,然後創建TotalDiscountCart,它將獲得總金額,然後對其應用折扣。問題與裝飾設計模式在java

現在我試圖運行下面給出的單元測試沒有給出正確的輸出。產品被添加到購物車中,但是當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()); 
    } 

回答

1

你應該CartDecorator委託addProductcart。由於CartDecorator不能從子類BaseCart中獲益,所以創建Cart接口也可能是有意義的。

請您詳細說明一下,「CartDecorator創建購物車界面不會從BaseCart的子類中獲益」。

您的BaseCart實際上做了兩件事。一個是定義與購物車一起使用的界面(由addProductgetTotalPrice方法組成)。另一個是提供addProduct的基本實現,其填充productsWithQuantity地圖。

現在a CartDecorator裝飾另一個購物車。它(當然)應該實現與所有購物車相同的界面。但是對於CartDecorator,從BaseCart繼承addProduct實施實際上會適得其反。由於CartDecorator可以委託addProduct到裝飾車 - 因此它實際上並不需要自己productsWithQuantity地圖等

這就是爲什麼它可能是有意義的定義Cart接口,如果你認爲你需要一個基本的抽象實現像BaseCart。然後CartDecorator將實現Cart接口但不延伸BaseCart

+0

您能否詳細說明一下,「CartDecorator創建購物車界面不會從BaseCart的子類中獲益」。 – user1298426

+0

@ user1298426查看更新。 – lexicore