java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...
我目前正在閱讀《Head First Design Patterns》一書,在"Decorator"一章中有以下示例:
在書中,conditionmentDecorator類被描述為一個abstract decorator。下面是代碼示例:
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
因此,基本上內部只是一個抽象方法,它強制所有子類從飲料類重寫getDescription()方法。
這里是一個mocha類的代碼示例,作為decorator。
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() +", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
其他裝修商(鞭子類,大豆類…)有完全相同的代碼,除了硬編碼的成本數字(.20)和名稱(",摩卡")。
然后,我們通過將前一個對象傳遞給新的裝飾器來使用這個裝飾器模式。
Beverage beverage = new DarkRoast();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
我的問題是,為什么不簡單地將復制的功能從裝飾器移到抽象裝飾器?下面是我如何重構示例。
抽象裝飾:
public abstract class CondimentDecorator extends Beverage {
private Beverage beverage;
protected CondimentDecorator(Beverage previousBeverage) {
this.beverage = previousBeverage;
}
@Override
public String getDescription() {
return beverage.getDescription() +"," + getAdditionName();
}
@Override
public double cost() {
return beverage.cost() + getAdditionCost();
}
public abstract String getAdditionName();
public abstract double getAdditionCost();
}
裝飾代碼:
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage);
}
@Override
public String getAdditionName() {
return"Mocha";
}
@Override
public double getAdditionCost() {
return 0.20;
}
}
現在,對于我創建的每個新的裝飾器,我都必須通過超類構造函數的構造函數提供以前的飲料對象,并且我需要重寫僅返回特定裝飾器的唯一值的方法。
這個代碼可以嗎?或者,如果我在抽象裝飾器中具有功能,它是否完全改變了裝飾器模式的要點?
您本質上是在問,如果您對decorator模式的實現進行了更改,那么您是否在改變它的使用點。相反,問問——裝飾圖案的意義是什么?如果你摸索的話,你會發現你仍然有飲料裝飾師,不管有沒有你的編輯。
這個代碼很好。經常閱讀課本(?)在他們的示例中呈現不太完美的代碼,這樣他們就可以專注于一個特定的概念(在本例中是裝飾師),而不必關注其他細節。事實上,你找到了一種改進這本書代碼的方法,這表明你實際上已經很好地理解了這個概念,能夠智能地使用它,而不僅僅是從引用中復制粘貼。
我認為答案是你不想在一節課上做兩件事。
CondimentDecorator做了一件事:連接兩個飲料。它真的應該被命名為"MixDecorator"
當你把調料的共同方面分解成代碼時,你需要創建另一個類,可以稱之為"命名調料",并將名稱和成本放在里面。
總結
以上是生活随笔為你收集整理的java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 场面壮观!云南超1亿只蝴蝶大爆发
- 下一篇: 高通认真了!自曝最强PC处理器:比苹果M