首页 > 其他分享 >23种设计模式-装饰器(Decorator)设计模式

23种设计模式-装饰器(Decorator)设计模式

时间:2024-11-25 11:32:59浏览次数:5  
标签:23 Component void component public 设计模式 装饰 Decorator

文章目录


类图: 装饰器设计模式类图

一.什么是装饰器设计模式?

装饰器模式(Decorator Pattern) 是一种结构型设计模式。它允许在运行时动态地为对象添加新的功能,而无需修改其代码。装饰器模式通过将对象嵌套在装饰器对象中,实现了功能的动态扩展,同时遵循了开放-关闭原则

二.装饰器模式的特点

  • 运行时动态扩展:通过嵌套装饰器对象,可以动态地为对象增加功能。
  • 与继承的区别:装饰器通过组合来扩展对象功能,而不是通过继承,避免了类爆炸问题。
  • 灵活性:可以使用多个装饰器类,按照需要灵活组合功能。

三.装饰器模式的结构

  • Component(组件接口):定义一个对象接口,可以动态地为其增加职责。
  • ConcreteComponent(具体组件):实现基础功能的类。
  • Decorator(抽象装饰器):实现 Component 接口,并包含一个指向 Component 对象的引用。
  • ConcreteDecorator(具体装饰器):实现额外的功能,并调用组件对象的原有功能。
    装饰器设计模式

四.装饰器模式的优缺点

  • 优点:
    • 动态扩展:可以动态地为对象添加功能。
    • 遵循开放-关闭原则:无需修改原有类的代码即可扩展功能。
    • 灵活性:装饰器可以灵活组合,扩展方式更具弹性。
  • 缺点:
    • 复杂性增加:使用多个装饰器会导致类数量增多,结构变得复杂。
    • 调试困难:由于功能是动态组合的,调试时可能难以定位问题来源。

五.装饰器模式的 C++ 实现

#include <iostream>
#include <memory>
using namespace std;

// 抽象组件
class Component {
public:
    virtual void Operation() const = 0;
    virtual ~Component() = default;
};

// 具体组件
class ConcreteComponent : public Component {
public:
    void Operation() const override {
        cout << "ConcreteComponent: Performing operation." << endl;
    }
};

// 抽象装饰器
class Decorator : public Component {
protected:
    shared_ptr<Component> component; // 持有组件的引用
public:
    Decorator(shared_ptr<Component> comp) : component(move(comp)) {}
    void Operation() const override {
        if (component) {
            component->Operation();
        }
    }
};

// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(shared_ptr<Component> comp) : Decorator(move(comp)) {}
    void Operation() const override {
        Decorator::Operation(); // 调用原始组件的功能
        AddedBehavior();        // 添加新行为
    }
private:
    void AddedBehavior() const {
        cout << "ConcreteDecoratorA: Adding behavior A." << endl;
    }
};

// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:
    ConcreteDecoratorB(shared_ptr<Component> comp) : Decorator(move(comp)) {}
    void Operation() const override {
        Decorator::Operation(); // 调用原始组件的功能
        AddedBehavior();        // 添加新行为
    }
private:
    void AddedBehavior() const {
        cout << "ConcreteDecoratorB: Adding behavior B." << endl;
    }
};

// 客户端代码
int main() {
    shared_ptr<Component> simple = make_shared<ConcreteComponent>();
    cout << "Client: Using a simple component:" << endl;
    simple->Operation();

    shared_ptr<Component> decoratorA = make_shared<ConcreteDecoratorA>(simple);
    cout << "\nClient: Using a component decorated with A:" << endl;
    decoratorA->Operation();

    shared_ptr<Component> decoratorB = make_shared<ConcreteDecoratorB>(decoratorA);
    cout << "\nClient: Using a component decorated with A and B:" << endl;
    decoratorB->Operation();

    return 0;
}

六.装饰器模式的 Java 实现

// 抽象组件
interface Component {
    void operation();
}

// 具体组件
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent: Performing operation.");
    }
}

// 抽象装饰器
abstract class Decorator implements Component {
    protected Component component;

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

    @Override
    public void operation() {
        if (component != null) {
            component.operation();
        }
    }
}

// 具体装饰器A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation(); // 调用原始组件的功能
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorA: Adding behavior A.");
    }
}

// 具体装饰器B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation(); // 调用原始组件的功能
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorB: Adding behavior B.");
    }
}

// 客户端代码
public class DecoratorPatternExample {
    public static void main(String[] args) {
        Component simple = new ConcreteComponent();
        System.out.println("Client: Using a simple component:");
        simple.operation();

        Component decoratorA = new ConcreteDecoratorA(simple);
        System.out.println("\nClient: Using a component decorated with A:");
        decoratorA.operation();

        Component decoratorB = new ConcreteDecoratorB(decoratorA);
        System.out.println("\nClient: Using a component decorated with A and B:");
        decoratorB.operation();
    }
}

七.代码解析

  • 抽象组件(Component)
    • 提供统一接口 Operation,供所有具体组件和装饰器实现。
    • 使得客户端代码可以以相同的方式使用组件和装饰器。
  • 具体组件(ConcreteComponent)
    • 实现基础功能,例如打印操作信息。
  • 抽象装饰器(Decorator)
    • 持有一个 Component 类型的指针,代表被装饰的对象。
    • 定义通用的装饰行为,默认直接调用被装饰对象的 Operation 方法。
  • 具体装饰器(ConcreteDecoratorA/B)
    • 通过扩展 Decorator 类,增加特定功能。
    • AddedBehavior 方法实现装饰器的额外行为,例如打印装饰信息。
  • 使用 shared_ptr
    • 动态管理对象内存,避免手动管理导致的内存泄漏。

八.总结

 装饰器模式提供了一种灵活的方式来动态扩展对象的功能,避免了继承导致的类膨胀问题。通过引入抽象装饰器和具体装饰器,装饰器模式实现了功能的动态组合,使得代码更易于维护和扩展。
应用场景:

  • 动态扩展对象功能:需要在不修改对象代码的情况下,为对象添加功能。
  • 替代子类扩展:避免因为子类扩展功能导致的类爆炸问题。
  • 灵活组合功能:需要根据不同的条件动态组合对象的功能。

标签:23,Component,void,component,public,设计模式,装饰,Decorator
From: https://blog.csdn.net/weixin_51169222/article/details/143888016

相关文章

  • 23种设计模式-外观(Facade)设计模式
    文章目录一.什么是外观设计模式?二.外观设计模式的特点三.外观设计模式的结构四.外观设计模式的优缺点五.外观设计模式的C++实现六.外观设计模式的JAVA实现七.代码解析八.总结类图:外观设计模式类图一.什么是外观设计模式? 外观设计模式(FacadePattern)是一种结......
  • [转]Docker/DockerHub 国内镜像源/加速列表(11月23日更新-长期维护)
    原文地址:Docker/DockerHub国内镜像源/加速列表(11月23日更新-长期维护)-轩辕博客文章目录 [隐藏]1 前言2 更新日志3 使用教程3.0.0.1 为了加速镜像拉取,使用以下命令设置registrymirror3.0.0.2 使用DockerHub代理,以下以docker.linkedbus.com 为例:可以根......
  • Openstack 社区版 2023.2 部署(all-in-one)
    一、版本介绍Openstack:2023.2Cephversion:PacificLinuxsystem:Rocky9.3网络:ens160(管理网)ens192(业务网)二、Rocky9.3系统安装三、系统环境配置1、修改ssh配置,允许root用户登录2、修改主机名、禁用防火墙和Selinuxhostnamectlset-hostnameco......
  • 微服务设计模式 - 物化视图模式(Materialized View Pattern)
    微服务设计模式-物化视图模式(MaterializedViewPattern)嗨,大家好!今天我们来聊聊一个在云计算设计中非常实用的模式——物化视图模式(MaterializedViewPattern)。背景和问题在现代分布式系统中,特别是在云计算环境下,我们经常会遇到这样的情况:我们有很多数据存储在不同的......
  • 学习日记_20241123_聚类方法(高斯混合模型)续
    前言提醒:文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。文章目录前言续:手动实现代码分析def__init__(s......
  • [20241123]PLSQL语句代码执行几次会缓存.txt
    [20241123]PLSQL语句代码执行几次会缓存.txt--//测试看看PLSQL语句代码执行几次会缓存。1.环境:SCOTT@book>@ver1PORT_STRING                   VERSION       BANNER-------------------------------------------------------------------------......
  • [20241123]测试软软解析遇到的疑惑3.txt
    [20241123]测试软软解析遇到的疑惑3.txt--//测试软软解析遇到的疑惑,就是大量软软解析以及分散执行两者的执行时间差别并不是很大,有点疑惑,发现调用select休眠的时间--//是1毫秒,而11g是1厘秒。而ash取样是1秒,这样在21c下相当于方法1000倍,11g下仅仅100倍。--//前面测试21c下的情况,在1......
  • [20241123]11g下测试遇到latch shared pool等待事件问题.txt
    [20241123]11g下测试遇到latchsharedpool等待事件问题.txt--//这是昨天测试遇到的问题,实际上以前也遇到,没有仔细探究。以前的方法就是启动后做小量延迟,规避这个问题,实际上还是出现。--//这次测试我总感觉哪里做的不对,仔细分析看看。1.环境:SCOTT@book>@ver1PORT_STRING    ......
  • 「撸一手好代码」设计模式之依赖倒置原则
    「撸一手好代码」设计模式之依赖倒置原则在复杂软件系统的构建中,如何有效管理模块间的依赖关系,是确保系统可维护性、可扩展性的关键。依赖倒置原则正是为了解决这一问题而提出的。接下来,我们将深入探讨这一原则的定义、重要性、应用方法,以及如何通过实践来优化我们的......
  • GESP2023年12月二级【小杨做题】
    想了一个半小时,还是太弱了啊啊啊啊啊!!!题目描述为了准备考试,小杨每天都要做题。第 1天,小杨做了 a道题;第 2 天,小杨做了 b 道题;从第 3天起,小杨每天做的题目数量是前两天的总和。此外,小杨还规定,当自己某一天做了大于或等于m 题时,接下来的所有日子里,他就再也不做题了。请......