[无论您赚多少钱,无论您多么有名,您仍然会感到空虚。您真正要寻找的是无条件的爱和完全的宽容] -Michael Jackson装饰器模式是一种结构模式,主要用于增强类的功能而不添加子类。如果有一个游戏基础课衍生了两种独立的运动,即篮球和足球,那么一个人既可以打篮球又可以踢足球,但是如果一个人想同时玩篮球和橄榄球怎么办?这样写吗? struct Game {virtual〜Game(){} virtual void Play()= 0;}; struct BasketBall:公共游戏{BasketBall(){} void Play()覆盖{std :: cout& lt; "打篮球
&quot ;; }};结构SocketBasketBall:公共游戏{SocketBasketBall(){} void Play()覆盖{std :: cout& lt;< "玩SocketBall
&quot ;; std :: cout& lt;& lt; "打篮球
&quot ;; }}; int main(){Game * ball = new SocketBasketBall(); ball-& gt; Play(); return 0;}如果有人想打篮球,足球和乒乓球,那么仍然有许多子类需要扩展,这显然不灵活。有没有一种方法可以扩展类的功能而又不增加许多子类?这使用装饰器模式,该模式可以增强现有类的功能,您可以看到以下代码实现:struct Game {virtual〜Game(){} virtual void Play()= 0;}; struct BasketBallDecorator:公共游戏{BasketBallDecorator(){} BasketBallDecorator(Game * game){game_ = game;} void Play()覆盖{std :: cout& lt; "打篮球
&quot ;; if(game_)game _-& gt; Play();}私人:Game * game _;}; struct SocketBallDecorator:公共游戏{SocketBallDecorator(){} SocketBallDecorator(Game * game){game_ = game;} void Play()覆盖{std :: cout& lt;& lt; "玩SocketBall
&quot ;;如果(game_)game _-& gt; Play();}私有:Game * game_;}; int main(){Game * ball = new BasketBallDecorator();球=新的SocketBallDecorator(球); //暂时忽略内存Leaking ball-> Play(); return 0;}这里装饰器类和原始类继承相同的父类,因此可以将多个装饰器类嵌套到原始类中,以增强该类的功能。模式与代理模式之间的重要区别在于,装饰器模式是对类的增强,具有与原始类相关的附加功能,而代理模式添加了与原始类无关的附加功能。当我们需要扩展类时当您需要添加函数或需要动态添加函数时,可以考虑使用装饰器模式。