zoukankan      html  css  js  c++  java
  • 23种设计模式之装饰模式

    装饰模式的定义

    定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活.

    通俗的说, 就是对一个类或方法进行包装

    装饰模式的通用类图:

    23种设计模式之装饰模式

     

    类图中的四个角色说明如下:

    1. Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心的角色, 也就是最原始的对象. 在装饰模式中, 必然有一个最基本、最核心的接口或抽象类充当 Component 抽象构件
    2. ConcreteComponent 具体构件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现, 要装饰的就是它
    3. Decorator 装饰角色: 一般是一个抽象类, 实现接口或抽象方法, 它里面不一定有抽象的方法, 在它的属性中必然有一个private变量指向Component抽象构件
    4. 具体装饰类: ConcreateDecrator是具体的装饰类, 要把最核心的、最原始的、最基本的东西装饰成其他东西. 当只有一个装饰类时, 可以没有抽象装饰角色

    具体实现代码如下:

    23种设计模式之装饰模式

     

    23种设计模式之装饰模式

     

    抽象装饰者代码:

    23种设计模式之装饰模式

     

    具体装饰者代码:

    23种设计模式之装饰模式

     

    场景类:

    23种设计模式之装饰模式

     

    装饰模式应用

    装饰模式的优点:

    1. 装饰类和被装饰类可以独立发展, 而不会相互耦合. 也就是说, Component 类无需知道 Decorator 类, Decorator 类是从外部来扩展 Component类的功能, 而Decorator也不用知道具体的构件
    2. 装饰模式是继承关系的一个替代方案. 我们看装饰类 Decorator, 不管装饰多少层, 返回的对象还是 Component.
    3. 装饰模式可以动态的扩展一个实现类的功能

    装饰模式的缺点:

    对于装饰模式记住一点就够了: 多层的装饰是比较复杂的.

    装饰模式的应用场景:

    1. 需要扩展一个类的功能, 或给一个类增加附加功能
    2. 需要动态的给一个对象增加功能, 这些功能可以再动态的撤销
    3. 需要为一批的兄弟类进行改装或加装功能, 当然首选装饰模式

    装饰模式是对继承的有力补充. 要知道继承不是万能的, 在项目中要考虑诸如易维护、易扩展、易复用等, 而且在一些情况下要是用继承就会增加很多子类, 而且灵活性非常差, 当然维护也不容易了, 也就是说装饰模式可以替代继承, 解决类膨胀的问题. 同时, 继承是静态的给类增加功能, 而装饰模式是动态的增加功能.

    装饰模式还有一个非常好的优点: 扩展性非常好.

  • 相关阅读:
    java泛型的一些知识点:Java泛型--泛型应用--泛型接口、泛型方法、泛型数组、泛型嵌套
    Java遍历Map的四种方式
    Less20、21、22【报错注入+Cookie字段注入+Base64编码】
    Less18、19【报错注入+User-Agent、Referer字段注入】
    Less17【报错注入+Update注入/时间注入】
    Less-16【盲注+时间注入】
    Less-15【盲注+时间注入】
    Less-14【报错注入】
    Less-12、13【报错注入】
    Less-11【报错注入】
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10171570.html
Copyright © 2011-2022 走看看