设计模式 -- 装饰模式

场景:

假如现在我们需要在不改变类的情况下,给类的添加一些不同的功能 ,那要怎么做更好?

  • 方法1:给这个类增加一个超类,超类上集成扩展功能
    但是这个方法有一个明显的问题,超类上的功能冗余会过大,造成子类内存占用浪费。

  • 方法2:继承本类生成子类,子类上添加新的功能,假如后期要添加很多种不同的功能,那么子类就可能爆炸增长。


装饰模式的概念

核心: 动态地给对象增加额外功能
也就是说,在不改变类原有功能的情况下额外给类扩展原有的功能。

很多时候,我们会想,能不能在不增加子类的情况下拓展本类?
此时装饰者模式就有很大的用武之地。


image.png

实现:

  • Shape: 是一个抽象类,只负责提供抽象方法

  • ShapeDecorator: 继承自Shape,提供实现Shape抽象方法的接口,是一个接口类,并且持有一个 Shape类的属性 decoratedShape,而 ShapeDecorator 类提供的Shape方法的接口内部就是交给decoratedShape属性去执行的,本质上本类并不实现Shape的抽象方法的实现。

  • ShapeSub: 继承自Shape,是真正重载实现Shape的抽象方法的类,对抽象方法可以有多种不同的实现(不同子类)。

  • ShapeDecoratorSub:继承自ShapeDecorator,重载ShapeDecorator对于Shape抽象方法的实现,添加差异性的实现。

  • 应用类:实际应用Shape抽象方法的类,调用的不是Shape,而是提供Shape抽象方法接口的 ShapeDecorator,或ShapeDecorator的子类。

代码实现

Shape

image.png

ShapeDecorator

image.png

image.png

ChineseShape

  • 继承自Shape


    image.png

JapaneseShape

  • 继承自Shape


    image.png

CountryShapeDecorator

  • 继承自ShapeDecorator


    image.png

方法的实际调用

image.png

总结:

从上面的图和讲解可以看到,ShapeDecorator 实际上它本身是不会去实现Shape的抽象方法的具体实现的,它只是提供了接口去调用其他实现了Shape抽象方法的类。所以ShapeDecorator 被称为 装饰者,而这个模式也被称“装饰者模式”。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:本次实现模型只是单层的装饰,假如引入了多层装饰,那么结构就会非常复杂,而实现很抽象,不容易理解。

装饰者模式继承模式 的一个很好的替代品,对比生成子类更加灵活

你可能感兴趣的:(设计模式 -- 装饰模式)