日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:抽象装饰器类中的功能而不是装饰器...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。