小谈设计模式(7)—装饰模式

小谈设计模式(7)—装饰模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 装饰模式
    • 装饰模式角色
      • Component(抽象组件)
      • ConcreteComponent(具体组件)
      • Decorator(抽象装饰器)
      • ConcreteDecorator(具体装饰器)
    • 工作流程
      • 首先
      • 其次
      • 然后
      • 最后
    • Java代码实现
      • 代码分析
    • 优缺点分析
      • 优点
        • 符合开闭原则
        • 可以动态地添加/删除功能
        • 遵循单一职责原则
        • 装饰器类与具体组件类独立
      • 缺点
        • 可能产生过多的具体装饰器类
        • 装饰器与组件类的接口不一致
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
小谈设计模式(7)—装饰模式_第1张图片

装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地向一个对象添加额外的功能,而不需要修改其原始类。通过将对象包装在装饰器类中,你可以在不改变现有对象结构的情况下,逐步地添加功能。

装饰模式角色

小谈设计模式(7)—装饰模式_第2张图片

Component(抽象组件)

定义了具体组件和装饰器的共同接口,可以是抽象类或接口。

ConcreteComponent(具体组件)

实现了抽象组件定义的接口,是被装饰的原始对象。

Decorator(抽象装饰器)

包含一个指向具体组件的引用,并实现了抽象组件定义的接口。

ConcreteDecorator(具体装饰器)

通过装饰器对具体组件进行扩展或修改,添加额外的功能。

小谈设计模式(7)—装饰模式_第3张图片

工作流程

首先

定义一个抽象组件(Component),它声明了具体组件和装饰器共同的接口方法。

其次

创建一个具体组件(ConcreteComponent),它实现了抽象组件的接口方法,是被装饰的原始对象。

然后

创建一个抽象装饰器(Decorator),它也实现了抽象组件的接口方法,并包含一个指向具体组件的成员变量(通常为抽象组件类型),用于持有被装饰的对象。

最后

创建具体装饰器(ConcreteDecorator),它继承自抽象装饰器,并在装饰器的基础上添加了额外的功能。具体装饰器中通常会重写抽象组件的接口方法,以在调用前后进行额外的处理,然后再调用被装饰对象的相应方法。
小谈设计模式(7)—装饰模式_第4张图片

Java代码实现

// Step 1: 定义抽象组件
interface Component {
    void operation();
}

// Step 2: 创建具体组件
class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("执行具体组件的操作");
    }
}

// Step 3: 创建抽象装饰器
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    public void operation() {
        component.operation();
    }
}

// Step 4: 创建具体装饰器
class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }

    public void operation() {
        // 在调用具体组件操作前进行额外处理
        System.out.println("在调用具体组件操作前进行额外处理");

        // 调用具体组件的操作
        super.operation();

        // 在调用具体组件操作后进行额外处理
        System.out.println("在调用具体组件操作后进行额外处理");
    }
}

// 使用装饰模式
public class Main {
    public static void main(String[] args) {
        // 创建具体组件对象
        Component component = new ConcreteComponent();

        // 创建具体装饰器对象,并将具体组件对象传入
        Component decorator = new ConcreteDecorator(component);

        // 调用装饰后的操作
        decorator.operation();
    }
}

代码分析

Component 是抽象组件接口,ConcreteComponent 是具体组件类,实现了抽象组件接口的方法。Decorator 是抽象装饰器类,实现了抽象组件接口,并持有一个抽象组件类型的成员变量。ConcreteDecorator 是具体装饰器类,继承自抽象装饰器类,并重写了操作方法,在调用前后添加了额外处理。

在主函数中,先创建具体组件对象ConcreteComponent,然后将其传入具体装饰器对象ConcreteDecorator 的构造函数中,用装饰器包装具体组件。最后调用装饰后的操作,会按照一定的顺序执行额外处理和具体组件操作。

优缺点分析

优点

符合开闭原则

可以在不修改现有代码的情况下,通过新增装饰器类来扩展对象的功能。

可以动态地添加/删除功能

可以根据需要动态地添加或删除对象的功能,组合不同的装饰器实现不同的行为组合。

遵循单一职责原则

具体的组件类只负责核心功能,具体的装饰器类只关注附加的功能,各个类职责明确,可维护性高。

装饰器类与具体组件类独立

装饰器类与具体组件类之间是松耦合的关系,可以独立变化,增加或删除装饰器不会影响其他组件的行为。

缺点

可能产生过多的具体装饰器类

如果系统中有很多功能需要扩展,可能会导致产生大量的具体装饰器类,增加系统的复杂性。

装饰器与组件类的接口不一致

在装饰器模式中,装饰器类和具体组件类的接口不一致,导致客户端需要区分调用。
小谈设计模式(7)—装饰模式_第5张图片

总结

装饰模式提供了一种灵活的、可扩展的方式来修改对象的功能,同时保持了简单的接口和代码的可维护性。但是需要权衡好扩展的复杂度和对象接口的一致性。

你可能感兴趣的:(细解设计模式,设计模式)