设计模式 -- 装饰模式
场景:
假如现在我们需要在不改变类的情况下
,给类的添加一些不同的功能 ,那要怎么做更好?
-
方法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.pngShapeDecorator
image.pngimage.png
ChineseShape
-
继承自Shape
image.png
JapaneseShape
-
继承自Shape
image.png
CountryShapeDecorator
-
继承自ShapeDecorator
image.png
方法的实际调用
image.png总结:
从上面的图和讲解可以看到,ShapeDecorator 实际上它本身是不会去实现Shape的抽象方法的具体实现的,它只是提供了接口去调用其他实现了Shape抽象方法的类。所以ShapeDecorator 被称为 装饰者,而这个模式也被称“装饰者模式”。
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:本次实现模型只是单层的装饰,假如引入了多层装饰,那么结构就会非常复杂,而实现很抽象,不容易理解。
装饰者模式
是 继承模式
的一个很好的替代品,对比生成子类更加灵活