美文网首页达叔的朋友圈们
大话设计模式读书笔记-6装饰模式

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

作者: QuietHeart | 来源:发表于2020-03-17 12:04 被阅读0次

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

    定义与功能

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

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

    实现与解释

    • Component: 定义采用装饰器模式的对象的抽象接口(Operation),便于动态添加职责
    • ConcreteComponent: Component子类实现,定义了具体的对象。
    • Decorator: Component子接口,装饰抽象类,用于扩展修饰Component类的对象(即将它做为Component类被另一个Decorator装饰形成不断装饰),但是Component对象却不用关注它。
    • ConcreteDecoratorXX: 具体装饰子类实现对象包括新增的属性功能,其继承的Operation接口会调用Component的Operation接口,并及添加新增的功能(装饰);其SetComponent接口会指明将要装饰那个Component(这个接口理解成“装饰”)
    • 客户端: 创建Componet具体对象,和待使用的Decorator对象,再用Decorator对象通过SetComponent装饰Componen,最后调用Decorator的Operation展示被包装的Operation功能。

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

    实现图如下:

    img

    使用图如下:

    img

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

    • 主类子链实现主要职责: 主类是抽象类Component,然后主类子链上继承的子类是实现类均只包含主要功能:ConcreteComponentxxx
    • 装饰类子链实现职责装饰:装饰类是抽象主类Component的抽象子类Decorator,内部调用Component的同样函数,然后其子类是主类装饰类子链上的实现类,主要是包装、装饰主类链的对象:ConcreteDecoratorxxx。

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

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

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

    使用与举例

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

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

    总结

    • 之所以装饰类和主类是父子关系,而非装饰类独立定义在中只包含主类,是因为setComponent设置的既可以是主类,也可以是Component类。
    • 将类的核心职责和装饰功能区分开(两者是兄弟关系),通过装饰功能扩展核心职责。

    相关文章

      网友评论

        本文标题:大话设计模式读书笔记-6装饰模式

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