裝飾者模式:動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活
要點1.繼承屬於擴充套件形式之一,但不見得是達到彈性設計的最佳方式
2.應該允許行為可以被擴充套件,而無須修改現有的**
3.組合和委託可用於在執行時動態地加上新的行為
4.裝飾者模式意味著一群裝飾者類,這些類用來包裝具體元件
5.裝飾者類反映出被裝飾的元件型別(事實上,他們具有相同的型別,都經過介面或繼承實現)
6.裝飾者被裝飾者的行為前面與/或後面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的
7.你可以用無數個裝飾者包裝乙個元件
8.裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別
9.裝飾者會導致設計中出現許多小物件,如果過度使用,會讓程式變得複雜
設計原則:類應該對擴充套件開放,對修改關閉。
[img]
beverage.h
#ifndef beverage_h
#define beverage_h
#include
using namespace std;
enum size;
class beverage
virtual string getdescription()const
virtual double cost()
virtual size getsize()const
private:
string mdescription;
size msize;
};#endif // beverage_h
condimentdecorator.h
#ifndef condimentdecorator_h
#define condimentdecorator_h
#include"beverage.h"
class condimentdecorator:public beverage;
#endif // condimentdecorator_h
houseblend.h
#ifndef houseblend_h
#define houseblend_h
#include"beverage.h"
class houseblend:public beverage
virtual string getdescription()const
size getsize()const
virtual double cost()
return mprice;
}private:
string mdescription;
double mprice;
size msize;
};#endif // houseblend_h
milk.h
#ifndef milk_h
#define milk_h
#include"condimentdecorator.h"
class milk:public condimentdecorator
string getdescription()const
double cost()
return mbvg->cost()+mprice;
}private:
string mdescription;
beverage* mbvg;
double mprice;
};#endif // milk_h
mocha.h
#ifndef mocha_h
#define mocha_h
#include"condimentdecorator.h"
class mocha:public condimentdecorator
string getdescription() const
double cost()
return mbvg->cost()+mprice;
}private:
string mdescription;
beverage* mbvg;
double mprice;
};#endif // mocha_h
main.cpp
#include"milk.h"
#include"houseblend.h"
#include"mocha.h"
#include
using namespace std;
int main()
houseblend:1.2
houseblend,mile:1.7
houseblend,mile,mocha:2.18
當系統需要新功能的時候,是向舊的類中新增新的**.這些新加的**通常裝飾了原有類的核心職責或主要行為.它們在主類中加入了新的字段,新的方法和新的邏輯,從而增加了主類的複雜度,而這些新加入的東西僅僅是為了滿足一些只在某種特定情況下才會執行的特殊行為的需要.而裝飾模式卻提供了乙個非常好的解決方案,它把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的物件,因此,當需要執行特殊行為時,客戶**就可以在執行時根據需要有地,按順序地使用裝飾功能包裝物件了
#include
#include
using namespace std;
class house
virtual ~house()
virtual void display()
};class furniturehouse:public house
virtual ~furniturehouse(){}
virtual void display()
public:
char mstr[128];
};class tvhourse:public furniturehouse
void display()
private:
house* mhouse;
char furstr[32];
};class airconditionhouse:public furniturehouse
void display()
private:
house* mhouse;
char furstr[32];
};int main()
house:0x93b4978
房子:床 凳子 電視 tvhouse:0x93b4a00
房子:床 凳子 電視 空調 airconditionhouse:0x93b4ab0
裝飾者模式decorator
設計原則 開放 關閉原則,對擴充套件開放,對修改封閉 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合設計而努力 類圖待補充 示例 飲料銷售系統 主體飲料 coffe 輔助調料 mocha,soy,whip。輔助調料價位都不一樣,當輔助調料和主飲料不同搭配時,最終飲料...
裝飾者(Decorator)模式
裝飾者模式是允許向乙個新物件新增新的功能,但又不改變其結構。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。就增加功能來說,裝飾器模式相比生成子類更為靈活。例子 如果我們去咖啡店,有一種咖啡,該咖啡可以加糖,牛奶,奶泡等等,如果我們需要加糖和牛奶,常規...
裝飾者模式 Decorator
1 作用 動態的給物件增加執行的業務,不受數量限制。可以代替子類,同時避免子類與父類的高耦合。增加靈活性。2 構成 2.1 裝飾者抽象類 decorator 可以是介面 最終生成乙個指向被裝飾物件基類 component 例項的引用,並定義乙個與被裝飾物件基類 component 介面一致的介面。通...