裝飾器和被裝飾的物件必須有完全一致的方法名。只是在裝飾器的方法中會呼叫被裝飾物件的同名方法
如果裝飾器和被裝飾的物件方法名不一致,那麼將導致裝飾之後的結果不能再次被另外乙個裝飾器裝飾(因為方法名已經變了)
base class:裝飾器模式的基類,(被裝飾物件)元件和裝飾器模板都需要繼承自基類
class beverage
virtual
std::string getdescription() //讓元件繼承,而不是為了讓裝飾器繼承
virtual
float cost() = 0; //讓子類元件實現
};
被裝飾物件1:飲料1
class orangejuice :public beverage
;float cost() override
//子類元件實現具體cost方法
};
被裝飾物件2:飲料2
};3.1裝飾器模板的定義
裝飾器模板_特別注意:也要繼承base
class decorator :public beverage
;std::string getdescription() override = 0; //裝飾器不繼承beverage的任何方法,把父類覆蓋的同時讓其本身成為乙個抽象介面
float cost() override = 0; //裝飾器不繼承beverage的任何方法,把父類覆蓋的同時讓其本身成為乙個抽象介面
};
3.2具體裝飾器的定義
裝飾器1:mocha
class mocha :public decorator
; //相同的操作被抽象到基類中,直接委託給基類實現
std::string getdescription() override //注意:裝飾器的所有函式都是在被裝飾物件函式的基礎上進行操作的,因此初始化乙個裝飾器需要儲存其裝飾物件的指標
float cost() override
};
裝飾器2:naiyou
class naiyou :public decorator
;std::string getdescription() override
float cost() override
};
#include "beverage.h"
#include
using
namespace
std;
int main()
程式設計經驗:
1)把子類中可能通用的操作盡可能放在父類中
2)c++中最好全部使用智慧型指標,而不要將傳統指標和智慧型指標混用
3)不能把普通指標轉換為智慧型指標,但智慧型指標可以轉換為普通指標,所以要盡可能用智慧型指標
C 設計模式 裝飾器模式
裝飾器模式,顧名思義就是對乙個主體進行修飾。原理就是用乙個新的類去包含乙個舊的類,在新的類中先呼叫舊的類的方法,再呼叫新的類中新新增的方法。這樣就實現了鏈式呼叫。然後可以不斷的新增新的修飾類去修飾。為了能使新的類 裝飾類 能夠包含舊的類 主體類或者已經經過修飾的修飾類 就需要統一基類,所以不論是主體...
C 設計模式 裝飾器模式
裝飾器模式簡單來說就是通過乙個裝飾器,不斷的去增強基類的現有功能,而不是去擴充子類。舉個例子 還是原來的汽車例子,有寶馬bwm和奧迪audi兩個車 class car class bwm public car class audi public car 如果我們想給兩種車上藍芽,無疑我們能夠通過增加...
設計模式 裝飾器模式 C 實現
裝飾器模式 動態的給乙個物件新增一些額外的職責,而不是給整個類新增一些功能。場景 1.以動態透明的方式給單個物件新增職責 2.不採用子類的方式進行擴充。裝飾器模式更加靈活的向物件新增職責,可以新增和分離方法,用裝飾在執行時刻增加和刪除職責。裝飾物件的介面和它所裝飾的物件的介面是一致的。裝飾模式採用把...