目錄
裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者模式提供了比繼承更有彈性的替代方案。
裝飾者模式遵循的設計原則:
類應該對擴充套件開放,對修改關閉。
裝飾者模式中的類如下圖,c++設計模式之裝飾模式
其中component抽象元件類,即被裝飾的類,每個元件都可以單獨使用,或者被裝飾者包起來使用。該類中宣告了一些介面,這些介面將在具體元件,以及具體裝飾者中實現。
concretecomponent具體元件類,繼承自元件類,是我們要動態地加上新行為(即要裝飾)的物件。
decorator抽象裝飾者類是具體裝飾者的基類,裝飾者類中包含乙個元件型別的指標,是為了記錄被裝飾的物件。當需要獲得裝飾之後的行為時可以通過該指標獲得被裝飾者的行為加上裝飾者自身的行為,這個在下面案例中會看到。
concretedecorator具體裝飾者類,裝飾者類要實現decorator中定義的方法,另外可以加一些新的方法。
如上圖所示裝飾者和被裝飾者必須是一樣地型別,也就是有共同地超類,這是相當關鍵的地方。這是因為裝飾者必須能取代被裝飾者。
咖啡館提供各種各樣的咖啡,每種咖啡可以加不同調料(摩卡、奶泡,雙醣,半糖等)。以飲料為抽象元件,各種各樣的咖啡為具體元件,咖啡中的不同調料為裝飾者。每種咖啡以及調料有各自的描述和**,使用裝飾者模式,加了不同調料的咖啡也可以輕鬆給出描述和**。
下面例子中生產三種咖啡:不加調料的espresso、加雙倍摩卡乙份奶泡的darkroast和加雙倍奶泡乙份摩卡的houseblend.。
宣告:類的宣告和實現在同乙個檔案裡是個壞習慣,壞習慣,壞習慣,但因為我懶,還是寫一起了,大家不要效仿,要引以為戒,要引以為戒,要引以為戒。
首先定義抽象元件類beverage和抽象裝飾者類condimentdecorator,**如下。這裡關鍵的地方是抽象裝飾者繼承自抽象元件,且包含乙個抽象元件的引用。
//抽象元件類-飲料
class beverage
virtual std::string getdescription()
virtual double cost() = 0;
protected:
std::string m_description;
};//抽象裝飾者類-調料,繼承自飲料類
class condimentdecorator :public beverage
virtual std::string getdescription() = 0;//定義成純虛函式,是為了強制子類例項化時必須實現它。
protected:
beverage* m_beverage;
};然後定義具體元件,即三種具體的咖啡darkroast、espresso和houseblend。
//三個具體元件
class darkroast :public beverage
double cost() };
class espresso :public beverage
double cost() };
class houseblend :public beverage
double cost()
};再定義兩個具體裝飾者類,即兩種調料mocha和milk。
//兩個具體裝飾者
class mocha :public condimentdecorator
std::string getdescription()
double cost() };
class milk :public condimentdecorator
std::strin程式設計客棧g getdescription()
double cost()
};最後在main函式中寫測試**,生產三種咖啡:不加調料的espresso、加雙倍摩卡乙份奶泡的darkroast和加雙倍奶泡乙份摩卡的houseblend.
//測試**
int main()
執行結果
本文標題: c++實現設計模式之裝飾者模式詳解
本文位址:
設計模式之裝飾者模式C 實現
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...
設計模式C 實現 裝飾者模式
裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者和被裝飾者有同樣的超累型別。能夠用乙個或多個裝飾者包裝乙個物件。既然裝飾者和被裝飾者物件有同樣的超累型別,所以在不論什麼須要原始物件 被包裝的 的場合,能夠用裝飾過的物件取代它。裝飾者能夠託付被裝飾者的...
c 設計模式之裝飾者模式
include 公共介面 class component 需要被裝飾的物件 class concretecomponent public component void operation 裝飾a類 class concretedecoratora public decorator 裝飾b類 clas...