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