裝飾者模式

2021-08-20 11:10:41 字數 1711 閱讀 6785

動態給乙個物件新增一些額外的職責,就象在牆上刷油漆.使用decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活。

使用物件組合的方式,做到執行時裝飾類。這樣可以在不修改任何底層**的情況下,給你的(或別人的)物件賦予新的職責。動態的將責任附加到物件上,想要擴充套件功能,裝飾者提供有別於繼承的另一種選擇。我們的目標是允許類容易擴充套件,在不修改現有**的情況下,就可搭配新的行為。這樣的設計具有彈性,可以應對改變,可以接收新的功能來應對改變。

通常可以使用繼承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的。

裝飾者類類在構造中引入乙個被裝飾元件,拿到它之後可以在元件的行為(方法)的前後加上自己的行為,甚至可以將元件的行為覆蓋掉,達到動態擴充套件新行為的功能。

uml類圖

這裡引用了《head first 設計模式》中關於裝飾者模式的例子

乙份咖啡可能加摩卡、奶泡等輔料。而每乙個輔料的**不一樣,如何設計程式才能讓最終計算咖啡**更簡單。使用裝飾者模式再好不過。

/**

* 該類為飲料抽象類,定義抽象方法cost(),用於計算飲料**

* 抽象元件

* @author xiangge.zeng

*/public abstract class beverage

public abstract double cost();}

/** * 濃縮咖啡,是一種飲料,繼承beverage基類

* 具體元件

* @author xiangge.zeng

* */

public class espresso extends beverage

/*** 計算價錢方法,返回濃縮咖啡的**

*/public double cost()

}/**

* 調料類,繼承於飲料基類。是抽象裝飾者,用於裝飾飲料元件

* @author xiangge.zeng

* */

public abstract class condimentdecorator extends beverage

/*** 裝飾者摩卡,用於裝飾咖啡.裝飾者擴充套件於元件,為了和元件保持統一從而裝飾元件

fileinputstream是低階流,它從檔案中讀取資料,但是它的效能有時不盡如人意。我們可以用一些高階流裝飾它。所謂的套用;它是「被裝飾者」。bufferedinputstream是乙個具體的裝飾者,它在原來的基礎上實現了利用緩衝來改進效能。

bufferedinputstream,linenumberinputstream都擴充套件自filterinputstream,它是乙個抽象的裝飾類。

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...