zoukankan      html  css  js  c++  java
  • 设计模式--装饰器模式

    装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。

    装饰模式包含如下角色:

    • Component: 抽象构件

    • ConcreteComponent: 具体构件

    • Decorator: 抽象装饰类

    • ConcreteDecorator: 具体装饰类

    其UML图如下:

    Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类Component。 

    ConcreteComponent 这个是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是这个对象。 

    Decorator 一般是一个抽象的装饰类,用于拓展Component中的功能。实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component。 

    ConcreteDecoratorA 和 ConcreteDecoratorB 是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成什么。

    装饰模式是对继承的有力补充,继承可不是万能的,继承可以解决很多实际的问题,但是在一些情况下你要是用继承就会增加很多子类,灵活性非常的差,也非常难以维护,在这样的情形下,装饰模式可以替代继承。


    继承是静态的给类增加功能,而装饰模式则是动态的给增加功能,如果业务临时变更,基于继承实现的代码很可能就需要修改程序,而装饰模式就不需要修改代码。具有良好的拓展性。

    装饰模式的优点:

    • 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 

    • 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。

    • 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

    • 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

    装饰模式的应用:

    Java I/O 使用了装饰者模式来实现。以 InputStream 为例,InputStream 是抽象组件,FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作。FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能,例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。

    实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。

  • 相关阅读:
    [CQOI2011]放棋子
    [CF1192B]动态直径
    [CERC2016]凸轮廓线
    19_08_14-19_08_21校内训练 补题
    [模板]线性递推+BM
    19_08_10[校内训练]割图
    [模板]多项式封装(无讲解)
    19_07_11校内训练[字串染色]
    CF990G
    19_07_09校内训练[分组]
  • 原文地址:https://www.cnblogs.com/wbringarden/p/9550937.html
Copyright © 2011-2022 走看看