www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 程序喵大人
[導(dǎo)讀]【無論你掙了多少錢,無論你有多出名,你仍會(huì)覺得空虛。你真正尋找的只是無條件的愛和完全的包容】 ——邁克爾 杰克遜 裝飾器模式屬于結(jié)構(gòu)型模式,主要用于在不增加子類的情況下增強(qiáng)一個(gè)類的功能。 假如有一個(gè)游戲基類,派生出籃球和足球兩個(gè)獨(dú)立運(yùn)動(dòng),一個(gè)人


【無論你掙了多少錢,無論你有多出名,你仍會(huì)覺得空虛。你真正尋找的只是無條件的愛和完全的包容】


——邁克爾 杰克遜


裝飾器模式屬于結(jié)構(gòu)型模式,主要用于在不增加子類的情況下增強(qiáng)一個(gè)類的功能。

假如有一個(gè)游戲基類,派生出籃球和足球兩個(gè)獨(dú)立運(yùn)動(dòng),一個(gè)人要么打籃球要么踢足球,但是如果一個(gè)人既要打籃球又要踢足球呢?這樣寫?
struct Game { virtual ~Game() {}
virtual void Play() = 0;};
struct BasketBall : public Game { BasketBall() {} void Play() override { std::cout << "play basketball \n"; }};
struct SocketBasketBall : public Game { SocketBasketBall() {} void Play() override { std::cout << "play SocketBall \n"; std::cout << "play BasketBall \n"; }};
int main() { Game* ball = new SocketBasketBall(); ball->Play(); return 0;}

如果有一個(gè)人又要打籃球又要踢足球又要打乒乓球呢,那還需要擴(kuò)展出好多子類,顯然不太靈活。有沒有方法可以在不增加很多子類的情況下擴(kuò)展類的功能呢?

這就用到了裝飾器模式,裝飾器模式可以增強(qiáng)現(xiàn)有類的功能,可以看如下代碼實(shí)現(xiàn):

struct Game { virtual ~Game() {}
virtual void Play() = 0;};
struct BasketBallDecorator : public Game { BasketBallDecorator() {} BasketBallDecorator(Game* game) { game_ = game; } void Play() override { std::cout << "play basketball \n"; if (game_) game_->Play(); }
private: Game* game_;};
struct SocketBallDecorator : public Game { SocketBallDecorator() {} SocketBallDecorator(Game* game) { game_ = game; } void Play() override { std::cout << "play SocketBall \n"; if (game_) game_->Play(); }
private: Game* game_;};
int main() { Game* ball = new BasketBallDecorator(); ball = new SocketBallDecorator(ball); // 暫時(shí)忽略內(nèi)存泄漏 ball->Play(); return 0;}

這里裝飾器類和原始類繼承同樣的父類,這樣就可以對(duì)原始類嵌套多個(gè)裝飾器類,起到增強(qiáng)類功能的作用。

裝飾器模式和代理模式有個(gè)重要區(qū)別就是裝飾器模式是對(duì)一個(gè)類的增強(qiáng),附加的是跟原始類有關(guān)的功能,而代理模式附加的是與原始類無關(guān)的額外功能。

當(dāng)我們需要擴(kuò)展一個(gè)類的功能或者需要?jiǎng)討B(tài)增加功能時(shí),可以考慮使用裝飾器模式。



往期推薦





免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉