装饰器模式
介绍
装饰器模式(Decorator Pattern),又称包装器模式(Wrapper Pattern):允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
类图
类图说明
- 抽象构件(
Shape
):可以是一个接口或者抽象类,充当被装饰类的原始对象,规定了被装饰类的行为。 - 具体构件(
Circle
、Rrctangle
)角色:实现抽象构件,通过装饰角色为其添加一些职责。 - 抽象装饰(
ShapeDecorator
)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 - 具体装饰(
RedShapeDecorator
)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
代码示例
抽象构件Shape
接口
1 | public interface Shape { |
具体构件Circle
类,实现了Shape
接口
1 | public class Circle implements Shape{ |
具体构件Rrctangle
类,实现了Shape
接口
1 | public class Rrctangle implements Shape{ |
抽象装饰器ShapeDecorator
类
1 | public abstract class ShapeDecorator implements Shape{ |
具体装饰器RedShapeDecorator
类
1 | public class RedShapeDecorator extends ShapeDecorator{ |
测试代码
1 | public static void main(String[] args) { |
测试截图
具体的装饰器我们可以扩展很多,只要继承抽象的装饰器类ShapeDecorator
就可以了。
装饰模式的扩展
装饰模式所包含的 4 个角色不是任何时候都要存在的,在有些应用环境下模式是可以简化的,有时候抽象装饰器是可有可无的。
只有一个具体装饰器,这样就不需要抽象装饰器,其结构图如下:
只有一个具体构件,这样就不需要抽象构件,抽象装饰者可以直接继承具体构件,其结构图如下:
只有一个具体构件和一个具体装饰者,这样抽象角色都不需要了,具体装饰者直接继承集体构件就可以了
优点
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
缺点
- 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
注意
装饰模式和代理模式的功能是雷同的,两者区别是:
- 装饰器模式强调自身功能的扩展,是代理模式的一个特殊应用。
- 代理模式强调对代理过程的控制。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 故友的学习录!
评论