也許我在這裏失去了一些東西,我承認我的OO技能不是我想要他們,但看看這example of the decorator pattern,我注意到UML聲明裝飾是兩者都是一個組件並且具有一個組件。這讓我爲難,在這一點它似乎是多餘的爲它是兩者,事實上,當我測試的「真實世界」的代碼,found here,並修改裝飾類看起來像這樣:裝飾模式與繼承和組合
abstract class Decorator /*: LibraryItem*/ {
protected LibraryItem libraryItem;
// Constructor
public Decorator(LibraryItem libraryItem) {
this.libraryItem = libraryItem;
}
public /* override */ void Display() {
libraryItem.Display();
}
}
...
class Borrowable : Decorator {
protected List<string> borrowers = new List<string>();
// Constructor
public Borrowable(LibraryItem libraryItem) : base(libraryItem) { }
public void BorrowItem(string name) {
borrowers.Add(name);
libraryItem.NumCopies--;
}
public void ReturnItem(string name) {
borrowers.Remove(name);
libraryItem.NumCopies++;
}
public new /*override*/ void Display() {
base.Display();
foreach (string borrower in borrowers) {
Console.WriteLine(" borrower: " + borrower);
}
}
}
我在這裏所做的只是通過註釋掉「:LibraryItem」來刪除is-a關係,但通過保留「protected LibraryItem libraryItem;」來保留has-a關係。我還注意到Display方法的替代方法用new關鍵字替換。盡我所能,這和原始代碼一樣。
我在這裏錯過了什麼嗎?裝飾器是否真的有必要從組件繼承? UML圖和實現代碼肯定會這樣,但我很好奇,如果有什麼我沒有看到或正確解決。
想法?
不管我看你的代碼有多長時間,我都看不到這裏的裝飾器。裝飾器的基本思想是將相同的界面遞歸應用於裝飾對象。在這裏沒有任何這樣的事情。 –
這是因爲我提供的代碼只是上述鏈接中提供的實際裝飾器的修改。 :) – EDanaII