(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例)

这篇具有很好参考价值的文章主要介绍了(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、装饰器模式(Decorator Pattern)含义

2、装饰器模式的UML图学习

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

4、装饰器模式的优缺点

5、C++实现装饰器模式的简单实例


1、装饰器模式(Decorator Pattern)含义

装饰模式(Decorator),动态地给一个对象添加一些额外地职责,就增加功能来说,装饰模式比生成子类更为灵活【DP】

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变现有对象结构的情况下,动态地向对象添加额外的功能。

装饰模式通过将对象包装在装饰器类中,实现了透明地扩展对象的能力。

2、装饰器模式的UML图学习

(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例),设计模式,装饰器模式,开发语言,c++,设计模式

 组成元素:

(1)Component是定义一个对象接口,可以给这些对象动态地添加职责;

(2)ConcreteComponent是定义了一个具体地对象,也可以给这个对象添加一些职责;

(3)Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能【DPE】

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 类表示具体组件,实现了抽象组件的接口。

Decorator 类是抽象装饰器,继承自 Component,并且持有一个 Component 的引用。它通过该引用调用被装饰对象的方法。

ConcreteDecorator 类是具体装饰器,继承自 Decorator,并实现了具体的装饰逻辑。在 operation 方法中,它先调用父类的 operation 方法,然后执行额外的操作。

在 main 函数中,我们创建了一个具体组件对象 component,并使用具体装饰器 ConcreteDecorator 对其进行包装。最后,调用装饰后的操作方法 decoratedComponent->operation(),会先执行具体组件的操作方法,然后执行具体装饰器的额外操作。

运行以上代码,输出将会是:

ConcreteComponent operation

Additional operation

可以看到,通过装饰模式,我们在不改变具体组件对象的情况下,动态地为其添加了额外的功能。文章来源地址https://www.toymoban.com/news/detail-661228.html

到了这里,关于(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【结构型模式】装饰者模式

    装饰模式 — Graphic Design Patterns 设计模式 | 装饰者模式及典型应用 黑马程序员Java设计模式详解-装饰者模式概述 装饰者模式 ( Decorator )是一种结构型设计模式,它允许你在 不改变 对象自身的基础上, 动态 地给一个对象 添加额外的功能 。该模式是通过创建一个包装对象来实

    2023年04月15日
    浏览(39)
  • 结构型模式-装饰者模式

    概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题: 扩展性不好 如果要再加一种配料(火

    2024年02月01日
    浏览(49)
  • 结构型模式(Structural Pattern)

    模式介绍 结构型模式(Structural Pattern)的主要目的就是 将不同的类和对象组合在一起,形成更大或者更复杂的结构体 。该模式并不是简单地将这些类或对象摆放在一起,而是要 提供它们之间的关联方式 。不同的结构型模式从不同的角度来组合类或对象,它们尽可能满足各

    2024年02月03日
    浏览(36)
  • 设计模式【结构型】-- 装饰者模式

    装饰者模式是一种 结构型设计模式 ,它允许你动态地将新功能添加到对象中,通过将对象放入包含这些功能的特殊包装器对象中。这样一来,你可以在运行时通过组合不同的对象来扩展功能,而不是通过继承修改代码。 大白话 : 装饰模式,是指在不改变原有对象的基础上

    2024年02月16日
    浏览(57)
  • 结构型-代理模式(Proxy Pattern)

    代理模式和适配器模式有什么区别?下面用两个示例来说明 适配器模式:假设你在家里有一个电源插座,但是你的笔记本电脑的电源线的插头是美国标准的,无法直接插到家里的电源插座中。这时,你可以使用一个适配器来解决这个问题。 代理模式:假设你家里有一个保姆

    2024年02月15日
    浏览(46)
  • 第八章结构型模式—装饰者模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构,有以下两种: 类结构型模式 :采用继承机制来组织接口和类。 对象结构型模式 :釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足 “合成复用原则”,所以对象结构型模式比类结

    2024年02月05日
    浏览(73)
  • 笨蛋学设计模式结构型模式-装饰者模式【9】

    7.3.1概念 ​ 装饰者模式通过在一个现有对象中,能动态的给该对象添加新的功能,同时不改变对象本身的结构,是继承的一种替代方案,可以实现在不定义子类的情况下,运行时动态地扩展对象的行为(给对象添加一些额外的功能),而无需修改原有代码。 7.3.2场景 ​ 当我们

    2024年01月17日
    浏览(51)
  • 【地铁上的设计模式】--结构型模式:装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象添加新的行为,同时又不改变原有对象的结构。装饰器模式中,包装器对象和被包装对象实现了相同的接口,因此客户端无需知道具体的实现细节,只需通过

    2024年02月02日
    浏览(40)
  • 【设计模式】第11节:结构型模式之“装饰器模式”

    装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设

    2024年02月06日
    浏览(47)
  • Java设计模式之结构型-装饰器模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二  五、总结  装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。 角色 描述 抽象构件 是一个接口或者抽象类,定义我们最核心的对象 具体构件 抽象构件的实现,

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包