2014-11-03 28 views
3
 
public abstract class Beverage { 

    protected String Description; 

    public String getDescription(){ 
     return Description; 
    } 

    public abstract int cost(); 

} 

public class Espresso extends Beverage{ 

    public int cost(){ 
     return 2; 
    } 
    public Espresso(){ 
     Description = "Espresso"; 
    } 
} 


abstract class CondimentDecorator extends Beverage{ 

    public abstract String getDescription(); 


} 

public class Mocha extends CondimentDecorator{ 

    Beverage beverage; 
    public Mocha(Beverage beverage){ 
     this.beverage=beverage; 
    } 

    @Override 
    public String getDescription() { 
     return beverage.getDescription()+", Mocha "; 
    } 
    @Override 
    public int cost() { 
     return beverage.cost()+0.5; 
    } 

    public Beverage remove(Beverage b) { 
     return b; 
    } 

} 
... 

有更多的像牛奶一樣..大豆..等,並像HouseBlend咖啡..等裝飾..如何從對象中移除裝飾器?

,如果我有對象的摩卡牛奶裝飾,我想只刪除「摩卡」裝飾。

Beverage beverage = new Mocha(new Espresso()); 
beverage = new Milk(beverage); 

編輯: 的情況是

  1. 客戶已將快報與摩卡咖啡和牛奶。

  2. 現在Expresso裝飾摩卡和牛奶。

  3. 突然客戶想用鞭子取代摩卡。

+0

我理解它可能只是一個例子,有想法,但在特定的設置,我可能不會使用一個裝飾,而是整合(例如,使用enum類),因爲無論裝飾器的順序如何(例如,Milk&Mocha與Mocha&Milk相同),您可能都希望保持Description的一致性。 – didierc 2014-11-03 12:44:56

回答

1

你必須爲提供者自己的邏輯,像:

CondimentDecorator#removeCondiment(Class <? extends CondimentDecorator>) 

有一個方法檢查它是否是包裝類的CondimentDecorator,並直接引用包裹飲料,繞過要刪除的裝飾器。在包裝飲料上遞歸調用包裝裝飾器不匹配。

1

沒有編寫自定義裝飾器來處理這個問題,你不能。除刪除裝飾的,你可以只重新飲料減去Mocha裝飾

beverage = new Milk(new Espresso()); 
相關問題