23种设计模式C++源码与UML实现--装饰者模式
生活随笔
收集整理的這篇文章主要介紹了
23种设计模式C++源码与UML实现--装饰者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裝飾者模式
github代碼倉庫
裝飾者模式(Decorator)又叫包裝模式,通過一種對客戶端透明的方式來擴展對象的功能,是繼承關系的一個替代方案。
裝飾模式就是把要添加的功能分別放到單獨的類中,并讓這個類中包含它要裝飾的對象,當需要執行的時候,客戶端可以有選擇地、按順序執的使用裝飾功能包裝的對象。
實用性
動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。
在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責
處理那些可以撤銷的職責
當不能采用子類的方法進行擴充時,一種情況是,可能有大量的獨立擴展,為支持每一種組合將產生大量的子類,使得子類數目爆炸性增長,另外一種可能是類的定義被隱藏,或類的定義不能用于生成子類。
裝飾者模式代碼實現:
// // Created by andrew on 2020/11/17. // #include <iostream>using namespace std;class Car { public:virtual void show() = 0;virtual ~Car() {} };class RunCar : public Car { public:virtual void show() {cout << "run car" << endl;}~RunCar() {} };// 當傳進來的是runcar的時候,就能實現在不繼承runcar的情況下擴展runcar的功能 class SwimCarDirector : public Car { public:SwimCarDirector(Car *car) {m_car = car;}~SwimCarDirector() {}void swim() {cout << "swim" << endl;}virtual void show() {m_car->show();swim();}private:Car *m_car; };// 當傳進來的是runcar的時候,就能實現在不繼承runcar的情況下擴展runcar的功能 class FlyCarDirector : public Car { public:FlyCarDirector(Car *car) {m_car = car;}~FlyCarDirector() {}void fly() {cout << "fly" << endl;}virtual void show() {m_car->show();fly();}private:Car *m_car; };int main(int argc, char *argv[]) { // 考點,虛基類雖然不能定義對象,但是能定義指針,指針指向子類Car *mycar = NULL;mycar = new RunCar;mycar->show();cout << "-------------------------" << endl; // 修飾模式,將run car修飾之后就能飛了FlyCarDirector *flyCar = new FlyCarDirector(mycar);flyCar->show(); //cout << "-------------------------" << endl;SwimCarDirector *swimCar = new SwimCarDirector(mycar);swimCar->show();delete swimCar;delete flyCar;delete mycar;cout << "decorator demo" << endl;return 0; }總結
以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--装饰者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【软件工程】极限编程
- 下一篇: s3c2440移植MQTT