美文网首页
设计模式 -- 装饰模式

设计模式 -- 装饰模式

作者: benlue | 来源:发表于2021-08-08 21:58 被阅读0次

    场景:

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

    • 方法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 被称为 装饰者,而这个模式也被称“装饰者模式”。

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

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

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

    相关文章

      网友评论

          本文标题:设计模式 -- 装饰模式

          本文链接:https://www.haomeiwen.com/subject/wigovltx.html