裝飾模式就是把要附加的功能分別放在單獨的類中,並讓這個類包含它要裝飾的物件,當需要執行時,客戶端就可以有選擇的、按順序的使用裝飾功能包裝物件
component(抽象構件):它是具體構件和抽象裝飾類的共同父類,宣告了在具體構件中實現的業務方法,它的引入可以使客戶端以一致的方式處理未被裝飾的物件以及裝飾之後的物件,實現客戶端的透明操作。
concretecomponent(具體構件):它是抽象構件類的子類,用於定義具體的構件物件,實現了在抽象構件中宣告的方法,裝飾器可以給它增加額外的職責(方法)。
decorator(抽象裝飾類):它也是抽象構件類的子類,用於給具體構件增加職責,但是具體職責在其子類中實現。它維護乙個指向抽象構件物件的引用,通過該引用可以呼叫裝飾之前構件物件的方法,並通過其子類擴充套件該方法,以達到裝飾的目的。
concretedecorator(具體裝飾類):它是抽象裝飾類的子類,負責向構件新增新的職責。每乙個具體裝飾類都定義了一些新的行為,它可以呼叫在抽象裝飾類中定義的方法,並可以增加新的方法用以擴充物件的行為。
(1) 動態、透明的方式給單個物件新增職責。
(2) 當不能採用繼承的方式對系統進行擴充套件或者採用繼承不利於系統擴充套件和維護時可以使用裝飾模式。裝飾器模式關注於在乙個物件上動態的新增方法,然而**模式關注於控制對物件的訪問。換句話說,用**模式,**類(proxy class)可以對它的客戶隱藏乙個物件的具體資訊。因此,當使用**模式的時候,我們常常在乙個**類中建立乙個物件的例項。並且,當我們使用裝飾器模式的時候,我們通常的做法是將原始物件作為乙個引數傳給裝飾者的構造器
#define _crt_secure_no_warnings
#include using namespace std;
//一般情況下 用繼承實現類的功能拓展,而裝飾模式可以動態給乙個類增加功能
//抽象英雄
class abstracthero;
//具體英雄
class heroa : public abstracthero
virtual void showstatus()
};//英雄穿上某個裝飾物 那麼他還是個英雄
class abstractequipment : public abstracthero
virtual void showstatus(){}
public:
abstracthero* phero;
};//配上刃
class knife : public abstractequipment
//增加額外功能
void addkuangtu()
virtual void showstatus()
};void test(void)
int main(void)
設計模式之裝飾設計模式
1.目的 動態擴充套件類的行為 開閉原則 對擴充套件開放,對修改關閉 2.要點 裝飾類和被裝飾類都實現同乙個介面或者繼承同乙個類 3.具體實現 被裝飾元件介面 被裝飾元件實現類實現 抽象類構建被裝飾元件實現被裝飾元件介面 裝飾類繼承抽象類 裝飾類 重寫抽象類方法 裝飾 4.例項 被裝飾類介面 pub...
設計模式之裝飾模式
有時如果需要對某乙個類增加乙個功能,可以使用繼承來實現。但是如果想要只是對某乙個物件來增加一項功能,則可能會用到裝飾模式。裝飾模式的主要作用是動態的給某乙個物件新增某些功能。如果此時使用繼承來新增功能時,會產生大量的子類,導致難以維護。裝飾模式的簡要類圖如下 其中 component為待增加功能 即...
設計模式之裝飾模式
template pattern 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...