設(shè)計模式之裝飾器模式
時間:2020-09-01 02:03:53
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]【無論你掙了多少錢,無論你有多出名,你仍會覺得空虛。你真正尋找的只是無條件的愛和完全的包容】 ——邁克爾 杰克遜 裝飾器模式屬于結(jié)構(gòu)型模式,主要用于在不增加子類的情況下增強一個類的功能。 假如有一個游戲基類,派生出籃球和足球兩個獨立運動,一個人
|
|
【無論你掙了多少錢,無論你有多出名,你仍會覺得空虛。你真正尋找的只是無條件的愛和完全的包容】 ——邁克爾 杰克遜 |
裝飾器模式屬于結(jié)構(gòu)型模式,主要用于在不增加子類的情況下增強一個類的功能。
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;}
如果有一個人又要打籃球又要踢足球又要打乒乓球呢,那還需要擴展出好多子類,顯然不太靈活。有沒有方法可以在不增加很多子類的情況下擴展類的功能呢?
這就用到了裝飾器模式,裝飾器模式可以增強現(xiàn)有類的功能,可以看如下代碼實現(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); // 暫時忽略內(nèi)存泄漏ball->Play();return 0;}
這里裝飾器類和原始類繼承同樣的父類,這樣就可以對原始類嵌套多個裝飾器類,起到增強類功能的作用。
裝飾器模式和代理模式有個重要區(qū)別就是裝飾器模式是對一個類的增強,附加的是跟原始類有關(guān)的功能,而代理模式附加的是與原始類無關(guān)的額外功能。
當我們需要擴展一個類的功能或者需要動態(tài)增加功能時,可以考慮使用裝飾器模式。
往期推薦
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





