介绍
装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时不改变其结构。这种类型的设计模式是结构型模式,是对原有类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持原有类功能和结构的前提下,提供了新的功能。
注意:装饰者模式与外观模式需要进行分辨
- 装饰者模式是对现有类(系统)进行包装,并提供新功能
- 外观模式是对现有类(系统)进行包装,向外界隐藏系统复杂性并提供操作系统的接口,没有提供新功能
意图
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
- 装饰者模式一般是通过方法传入已有类的对象作为参数,在方法中实现新的功能,就不会破坏原有类的结构
主要解决
- 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
- 主要在不想增加很多子类的情况下扩展类
如何解决
将具体功能职责划分,同时继承装饰者模式
关键代码
- Component 类充当抽象角色,不应该具体实现
- 修饰类引用和继承 Component 类,具体扩展类重写父类方法
优点
- 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点
- 多层装饰比较复杂
总的来说:假设需要扩展功能的类是B,类B是接口A的实现类,现在我们创建一个抽象的装饰类实现接口A,这样装饰类就和类B有了同样的方法了,然后创建具体的装饰类继承抽象装饰类,具体的装饰类根据实际要求来装饰类B。
实现
创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。
RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。
UML类图
1、创建接口
1 | public interface Shape { |
2、创建接口的实体类
1 | public class Rectangle implements Shape { |
3、创建接口的抽象装饰类
1 | public abstract class ShapeDecorator implements Shape { |
4、创建实体装饰类
1 | public class RedShapeDecorator extends ShapeDecorator { |
5、使用装饰类
1 | public class DecoratorPatternDemo { |
输出结果:
1 | Circle with normal border |
可以看到装饰前的对象与装饰后的对象输出结果不同。
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/14/designPattern/2020-03-14-decoratorPattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!