設計模式之 裝飾器模式

2022-08-05 19:03:14 字數 1351 閱讀 8169

裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。

這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。

舉個例子

食街新開了一家奶茶店,店長需要考慮怎麼加工製作奶茶比較好。奶茶有多種(原味、燒仙草、焦糖),在這基礎上可以加的材料也有多種(冰、珍珠、青稞)。其他種類奶茶都以 未加工的奶茶 為基礎進行加工製作。

一開始,店長是打算這樣做的。 打個比方,店員a負責焦糖奶茶的製作,店員b負責在焦糖奶茶的基礎上加冰,店員c負責在焦糖加冰的基礎上加青稞,店員d負責在焦糖奶茶的基礎上加青稞。以此類推。

按這個計畫,店長算了一下需要的人手, 三種奶茶最基本的製作(原味、燒仙草、焦糖)需要3名店員,(焦糖+冰、焦糖+珍珠、焦糖+青稞、焦糖+冰+珍珠、焦糖+冰+青稞、焦糖+珍珠+青稞、焦糖+冰+珍珠+青稞)一種奶茶加材料有需要7名店員,總共 需要招 3+3*7 = 24 名店員 。

算到這,突然想到,如果將來新增新種類的奶茶或材料(糖、布丁),那不是又要招很多人。

想到這,店長臉就黑了,生意雖然好,招這麼多店員,店員都快比客戶多了,還賺什麼錢,管理也不容易,不行,這個方案不行!

「 可以解決問題,但層層繼承,子類會比較膨脹,耦合性太強 」 說的就是上面這種情況。

在苦苦思考中,店長靈光一閃,想到了之前看到的裝飾器模式,發現了在材料的新增上耗費了很多人力,就又制定了乙個方案。 打個比方,店員a負責焦糖奶茶的製作,店員b負責在各種奶茶的加冰操作,店員c負責在各種奶茶的加青稞操作,店員d負責在各種奶茶的加珍珠操作。以此類推。

按這個方案,店長又算了一下需要的人手,三種奶茶最基本的製作(原味、燒仙草、焦糖)還是需要3名店員,三種材料的新增(冰、珍珠、青稞)只需要3名店員,總共 需要招 3+3 = 6 名店員。如果將來新增新種類的奶茶或材料(糖、布丁),也只是需要多幾個人而已。

誒,這個方案可行,店長笑了,有錢賺,又方便管理。

「 裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的乙個替代模式,裝飾模式可以動態擴充套件乙個實現類的功能。 」

另外,店長也注意到了,對於客戶的需求,一杯奶茶可能要經過多個負責材料新增的店員。這個時候就需要做好 加工分配的流程,雖然這個可能會複雜點,但店長可以接受。

「 多層裝飾使用起來相對比較複雜 」

優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的乙個替代模式,裝飾模式可以動態擴充套件乙個實現類的功能。

缺點:多層裝飾比較複雜。

使用場景:1、擴充套件乙個類的功能。 2、動態增加功能,動態撤銷。

注意事項:可代替繼承。

共同學習,共同進步,若有補充,歡迎指出,謝謝!

設計模式之裝飾器模式

定義 decorator裝飾器,顧名思義,就是動態地給乙個物件新增一些額外的職責,就好比為房子進行裝修一樣。因此,裝飾器模式具有如下的特徵 它必須具有乙個裝飾的物件。它必須擁有與被裝飾物件相同的介面。它可以給被裝飾物件新增額外的功能。用一句話總結就是 保持介面,增強效能。裝飾器通過包裝乙個裝飾物件來...

設計模式之裝飾器模式

什麼是裝飾器模式 decorator 裝飾器模式的優點 裝飾器模式的缺點 示例 package com.pattern.decorator 抽象類,裝飾器的父類 author yjzhou public abstract class decorator implements component ov...

設計模式之裝飾器模式

裝飾模式 decorator 顧名思義,裝飾模式就是給乙個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同乙個介面,裝飾物件持有被裝飾物件的例項,關係圖如下 source類是被裝飾類,decorator類是乙個裝飾類,可以為source類動態的新增一些功能,如下 1.public ...