設(shè)計(jì)模式之裝飾器模式
掃描二維碼
隨時(shí)隨地手機(jī)看文章
|
|
【無論你掙了多少錢,無論你有多出名,你仍會(huì)覺得空虛。你真正尋找的只是無條件的愛和完全的包容】 ——邁克爾 杰克遜 |
裝飾器模式屬于結(jié)構(gòu)型模式,主要用于在不增加子類的情況下增強(qiáng)一個(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;}
這里裝飾器類和原始類繼承同樣的父類,這樣就可以對原始類嵌套多個(gè)裝飾器類,起到增強(qiáng)類功能的作用。
裝飾器模式和代理模式有個(gè)重要區(qū)別就是裝飾器模式是對一個(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)立場,如有問題,請聯(lián)系我們,謝謝!





