裝飾器模式

2021-09-11 18:58:38 字數 2846 閱讀 7987

什麼是裝飾器模式?

如果對已有物件的部分內或功能性發生改變,但是不需要修改原始物件的結構,那麼使用裝飾器設計模式最適合。

裝飾器模式應用問題與解決方案:

我們最開始學習物件導向程式設計的相關知識時,第乙個障礙往往是理解繼承當中的父子關係。隨著時間的推移,我們會更加熟悉這種程式設計方法。當面對新的挑戰時,經驗豐富的物件導向程式設計人員會立即為某個物件擴充套件更多的功能。不過,正如萬物皆有度,只有適度的使用才能保證這種工作的良好開展。

**庫應當對類層次的數量有限制。如果物件開始要求啟用過多的子類,那麼相應的**就會犧牲程式設計人員的理解力和可維護性。通常,我竭力保證用於乙個物件的父子關係不超過3個。我發現:只要建立較多的父子關係,那麼**就會變得混亂和難以控制。除此之外,使用一般的紙張也無法答應出應用程式中任何物件的uml圖表示。

不過,我並不希望阻止類擴充套件的使用。實際上,我們經常使用適當的解決方案來擴充套件物件。但是,對於某些問題來說,使用基於裝飾器設計模式的類是更好的解決方案。

裝飾器設計模式適用於程式設計人員話費大量時間所處的下列工作場合:變化是快速和細小的,而且幾乎不影響應用程式的其餘部分。使用裝飾器設計模式設計類的目標是:不必重寫任何已有的功能性,而是對某個基物件應用增量變化。裝飾器採用這樣的構建方式:在主**流中應當能夠直接插入乙個或多個更改或「裝飾」目標物件的裝飾器,同時不影響其他**流。

uml下uml圖詳細說明了乙個使用裝飾器設計模式的類設計。

下面對上圖的說明:

1.myobject是具有現有功能性的基類。這個類包含名為items的公共陣列和名為show itemsformatted()的公共方法。

2.show itemsformatted()方法負責接受items陣列,並且使用預定義的功能性格式化該陣列後提交輸出。

3.myobjectdecorator類包含myobject的乙個私有例項和兩個公共方法:myobjectdecorator()和decorateitems()。

4.myobjectdecorator()方法代表建構函式,它接受乙個myobject型別引數並將其儲存在內部。

5.decorateitems()方法可修改myobject例項的items陣列。

我們來看下面這個例子,為了計算一塊區域的價值,我們把**寫成下面這個樣子:

// 區域抽象類

abstractclassarea

//森林類,價值100

classforestextendsarea

}

//沙漠類,價值10

classdesertextendsarea

}

上面的**看上去好像沒有什麼問題,但是如果需要給一片被破壞的森林計算價值怎麼辦呢,新增damageforest子類麼?顯然是不可行的,因為很有可能還有其他很多態別疊加的類,這會導致類中可能會有重複的**,且子類也會變的越來越多。

裝飾器模式使用組合和委託,而不是使用繼承來解決上述的問題,我們在來看下面改良過的**:

// 區域抽象類

abstractclassarea

//森林類,價值100

classforestextendsarea

}

//沙漠類,價值10

classdesertextendsarea

}

//區域類的裝飾器類

abstractclassareadecorateorextendsarea

}

//被破壞了後的區域,價值只有之前的一半

classdamagedextendsareadecorateor

}

//現在我們來獲取被破壞的森林類的價值

$damageforest=newdamaged(newforest());

echo$damageforest->treasure();//返回50

裝飾器模式

大話設計模式 裝飾器模式 為已有功能動態地新增更多功能,當系統需要新功能,向舊的類中新增新功能,裝飾了原有類的核心職責和行為,而不改變它們 就像包裝袋一樣,有 的包裝袋包裝之前裝好東西的包裝袋 ifndef clothes h define clothes h include using names...

裝飾器模式

裝飾器設計模式 對真實物件動態的新增功能 抽象元件 author zhangjianbin public inte ce icar 俱體構件物件 真實的物件 author zhangjianbin class car implements icar 裝飾器物件 author zhangjianbin...

裝飾器模式

一 概念 裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該 盡量使用物件組合,而不是物件繼承來擴...