設(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;
}
這里裝飾器類和原始類繼承同樣的父類,這樣就可以對(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)系我們,謝謝!