达叔的朋友圈们

大话设计模式读书笔记-6装饰模式

2020-03-17  本文已影响0人  QuietHeart

第6章 穿什么有这么重要?——装饰模式

定义与功能

为已有类动态添加功能。简化主类,使主类只具有核心功能,将装饰性质功能的类做为主类的子类,在子类中实现。

特点:把类中装饰功能从类中搬移去除,简化原有的类;这样有效地将类的核心职责和装饰功能区分开了,可以取出相关类的重复装饰,以及方便的向类中添加新的装饰功能。

实现与解释

装饰的时候,用子类“包装”主类。具体为:客户端创建Componet具体对象,创建待使用的Decorator对象,Decorator对象通过SetComponent对具体的Component,以及装饰过Component的Decorator进行包装,最后包装在最外面的Decorator调用Operation展示被包装的Operation功能。

实现图如下:

img

使用图如下:

img

如果不使用装饰类,那么装饰的功能将定义在主类或主类链的子类上,无法自由控制其顺序。

也就是说,主要的功能在主类,以及主类子链的子类上;修饰的功能,在主类装饰子链上的子类上。

添加不同的装饰功能,可以实现多个装饰子类,用于装饰主类不同性质的内容,然后可以按照任意次序先包装主类(setComponent(主类)), 然后再包装被包装的类(setComponent(xx)),这样最终,通过最后的包装类展示主类的功能。

被装饰的类(比如Component)做为装饰类一个的成员,通过setComponent()之类的函数实现赋值,然后会在装饰抽象父类的对应操作(如show())中,调用这个主类成员对象的操作(比如show()),子具体实现装饰类中的调用形式是先 base::show() 在自己的动作。但是,必定最初的装饰类,以主类对象做为其包装的类(比如父抽象装饰类先将主类设置好,之后的装饰类通过setComponent来后续设置)

使用与举例

比如对于书中例子,人与各种服饰。这里,只有一个人的Component类,所以不必抽象Component,直接服饰继承人类就行,然后各类服饰子类做为装饰类。

例子中:每个主类(人)只有一个功能:show(), 而装饰类(服饰)的show()是调用它包装的类的show()再加上自己的功能。每次创建新的服饰,就调用祺 setComponent() 传入一个被修饰主类或者直接主类对象,形成一个新的被装饰的主类对象。其show()会调用之前的主类、装饰类的show(),然后再调用自己的show()特定动作。

总结

上一篇下一篇

猜你喜欢

热点阅读