structural_patterns/decorator.rst
.. _decorator:
.. contents:: 目录
一般有两种方式可以实现给一个类或对象增加行为:
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
装饰模式包含如下角色:
.. image:: /_static/Decorator.jpg
.. image:: /_static/seq_Decorator.jpg
.. literalinclude:: /code/Decorator/main.cpp :language: cpp :linenos: :lines: 1- :emphasize-lines: 10-16
.. literalinclude:: /code/Decorator/ConcreteComponent.cpp :language: cpp :linenos: :lines: 1-
.. literalinclude:: /code/Decorator/ConcreteDecoratorA.h :language: cpp :linenos: :lines: 1-
.. literalinclude:: /code/Decorator/ConcreteDecoratorA.cpp :language: cpp :linenos: :lines: 1- :emphasize-lines: 22-30
运行结果:
.. image:: /_static/Decorator_run.jpg
实例:变形金刚
变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。
.. image:: /_static/Decorator_eg.jpg
.. image:: /_static/seq_Decorator_eg.jpg
装饰模式的优点:
装饰模式的缺点:
在以下情况下可以使用装饰模式:
装饰模式的简化-需要注意的问题: