一、模式定义
动态地将责任附加到对象上,如果要扩展功能,装饰者提供比继承更有弹性的替代方案。
二、所体现出的设计原则
开放-关闭原则:类应该对扩展开放,对修改关闭。
三、UML图示
四、应用场景
1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2. 处理那些可以撤消的职责。
3. 当不能采用生成子类的方法进行扩充时:一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
五、注意事项
1. 装饰者和被装饰者必须派生自相同的抽象基类,这样客户无需知道一个对象到底被包装了没有,或者是被包装了多少层。装饰者会调用被装饰者的方法,并在其前或者后加上自己的方式。这样一来,行为就被扩展了,同时不必对原有代码进行修改。
2. 装饰者模式完全遵守开放-关闭原则,其缺点是容易产生大量的装饰类。
六、举例说明
用Junit举个例子吧(虽然偶也只会点儿皮毛,嘿嘿)。Junit中,TestDecorator 和 RepeatedTest 就是对TestCase的装饰模式扩展应用。
这里Test 接口中定义了一个方法 public void run(TestResult result),被装饰者TestCase定义了这个方法以执行用户定义的测试用例。同时装饰者RepeatedTest也定义了这个方法,但执行方法是“连续调用TestCase的run方法N次”。
七、代码示例
维基百科:http://zh.wikipedia.org/wiki/%E4%BF%AE%E9%A5%B0%E6%A8%A1%E5%BC%8F