2024年最全(二)结构型模式:5、装饰器模式(Decorator Pattern,2024年最新那些被大厂优化的程序员们

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

3、装饰器模式的应用场景

(1)IO流操作:在IO流中,可以使用装饰器模式来添加缓冲、加密、压缩等功能,而无需修改原始的IO类。

(2)GUI组件:在图形用户界面中,可以使用装饰器模式来为组件添加边框、滚动条、阴影等外观效果。

(3)日志记录:可以使用装饰器模式来为日志记录器添加时间戳、日志级别等额外信息。

(4)权限控制:可以使用装饰器模式来为对象添加权限验证、身份认证等功能。

总之,装饰器模式适用于需要动态地为对象添加功能,并且希望保持对象接口的一致性的场景。

它提供了一种灵活、可扩展和可维护的方式来处理对象功能的变化和组合。

4、装饰器模式的优缺点

(1)优点:

1)动态地为对象添加功能:装饰器模式允许在运行时动态地为对象添加额外的功能,而无需修改原始对象的结构。这对于需要灵活地扩展对象功能的情况非常有用。

2)避免使用子类进行扩展:通过使用装饰器模式,可以避免创建大量的子类来实现不同组合的功能。相反,可以通过组合和堆叠装饰器来实现各种功能组合,从而更好地管理和维护代码。

3)对象功能的透明性:装饰器模式使得客户端可以透明地使用被装饰对象和装饰后的对象,无需关心具体对象的类型。这样可以简化客户端代码,并且使得代码更加清晰易懂。

4)单一职责原则:装饰器模式可以将功能划分到不同的装饰器中,每个装饰器只负责一个特定的功能,符合单一职责原则。这样可以使得代码更加可维护和可扩展。

(2)缺点:

1)增加复杂性:使用装饰器模式会引入更多的类和对象,从而增加了系统的设计复杂性。这可能会导致代码结构变得复杂,不易理解和维护。

2)多层装饰影响性能:当使用多个装饰器进行功能堆叠时,可能会对性能产生一定的影响。每个装饰器都会增加额外的处理逻辑,可能会导致性能下降。

3)可能造成对象过度膨胀:如果使用过多的装饰器或者装饰器的组合方式不合理,可能会导致对象过度膨胀,使得系统资源消耗增加。

**总结:**尽管装饰器模式存在一些缺点,但它仍然是一种强大且常用的设计模式,特别适用于需要动态地为对象添加功能的场景。

在使用装饰器模式时,需要根据具体的需求和系统设计来权衡其优缺点,并确保合理地应用该模式。

5、C++实现装饰器模式的简单实例
#include <iostream>

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

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

// 抽象装饰器
class Decorator : public Component 
{
protected:
    Component* component;

public:
    Decorator(Component* component) : component(component) {}

    void operation() const override 
    {
        if (component != nullptr) 
        {
            component->operation();
        }
    }
};

// 具体装饰器
class ConcreteDecorator : public Decorator 
{
public:
    ConcreteDecorator(Component* component) : Decorator(component) {}

    void operation() const override 
    {
        Decorator::operation();
        additionalOperation();
    }

    void additionalOperation() const 
    {
        std::cout << "Additional operation" << std::endl;
    }
};

int main()
 {
    // 创建具体组件对象
    Component* component = new ConcreteComponent();

    // 使用具体装饰器包装具体组件对象
    Component* decoratedComponent = new ConcreteDecorator(component);

    // 调用装饰后的操作方法
    decoratedComponent->operation();

    delete decoratedComponent;
    delete component;

    return 0;
}

在上述示例中,我们定义了一个 Component 接口作为抽象组件,其中包含了一个 operation 方法。ConcreteComponent 类表示具体组件,实现了抽象组件的接口。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

上C C++开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值