简单易懂23种设计模式——装饰者模式【含C++代码实例】

   在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度。
  根据《设计模式——可复用面向对象软件的基础》所说:“你必须找到相关的对象,以适当的颗粒度将他们回归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。
  内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用的解决方案。这些重复的模式方案解决特定的问题,使得面向对象的设计更灵活、优雅,最终复用性更好。它们帮助设计者将新的设计建立在以往的工作基础上,复用以往的成功设计方案。一个熟悉这些设计模式的设计者不需要再去发现它们,而能够立即将他们应用于设计问题中。
  本系列文章主要参考文献为——设计模式,可复用面向对象软件的基础(Design Patterns Elements of Reusable Object-Oriented SoftWare Erich.),内部代码基本用C++语言编写。
  汇总链接:23种设计模式C++实现——概要(索引汇总)

摘要

   本章主要说明装饰者模式,该设计模式主要意图是:动态的给一些对象添加一些额外的职责,相比于继承子类更加灵活。
   有的时候我们想给某个对象增加一些功能(而不是给整个类增加功能,不需要通过定义子类添加新的类实现),例如一个普通滑块增加立体效果,在一个普通样式增加花纹。
   具体实现下边我们就通过一个小栗子来说明什么是装饰者模式。

主要参与者

该设计模式的参与者有5个,分别是:

  1. Virtual Component 抽象对象的接口,可以给这些对象动态的添加职责
  2. Concrete Component 实例对象,可以给这个对象增加一些职责
  3. Virtual Decorator 维持一个指向Component对象的指针,并定义与Component接口一致的接口
  4. Concrete Decorator 具体向组件添加职责
  5. Client 用户

优点

具体实现代码

例子中Cake是抽象鸡蛋灌饼接口,OriginalCake是不加任何配料的原味鸡蛋灌饼,Decorator是抽象装饰器,EggAddCake 是给当前饼再加一个鸡蛋,SausageAddCake 是给当前饼再加一个香肠,我们在买鸡蛋灌饼时可以选择什么都不加,或加一个蛋,加多个蛋,加肠,加多个肠,同时加蛋和肠的情况,如果使用继承的方式实现上述操作可能会造成产生很多类且比较死板,比如说加蛋一个类,加肠一个类,同时加蛋和肠一个类,如果有其他配菜则会更加复杂,而使用装饰者模式则是在原有实例对象的基础上增加修饰,接下来我们通过一个实例代码来说明具体实现:

对象的接口(Component )

/****************************************************************
 Author :   BingLee
 Date   :   2019-08-07
 Info   :
 https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#ifndef CAKE_H
#define CAKE_H
#include <stdio.h>
class Cake
{
public:
    virtual void Info() = 0;
    virtual float Price() = 0;
};

class OriginalCake : public Cake
{
public:
    OriginalCake(){}
    void Info(){printf("Original test cake. ");}
    float Price(){return 3.0;}  //base price
};

#endif // CAKE_H

装饰器的接口(Decorator)

/****************************************************************
 Author :   BingLee
 Date   :   2019-08-07
 Info   :
 https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#ifndef DECORATOR_H
#define DECORATOR_H
#include "cake.h"

class Decorator : public Cake
{
public:
    Decorator(Cake *cake = 0){
        this->Init(cake);
    }
    void Init(Cake *cake){
        if(0 == cake)
            this->m_cake = new OriginalCake;
        else
            this->m_cake = cake;
    }
    virtual void Info(){m_cake->Info();}
    virtual float Price(){return m_cake->Price();}
protected:
    Cake *m_cake;
};

class EggAddCake : public Decorator
{
public:
    EggAddCake(Cake *cake = 0){Init(cake);}
    void Info(){
        m_cake->Info();
        printf("Add Egg. ");}
    float Price(){return m_cake->Price() + 1.5;}
};

class SausageAddCake : public Decorator
{
public:
    SausageAddCake(Cake *cake = 0){Init(cake);}
    void Info(){
        m_cake->Info();
        printf("Add Sausage. ");}
    float Price(){return m_cake->Price() + 2.0;}
};

#endif // DECORATOR_H

用户(Client)

#include <QCoreApplication>
#include "cake.h"
#include "decorator.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //原味鸡蛋灌饼
    OriginalCake *originalCake = new OriginalCake;
    originalCake->Info();
    printf("\n Price %.2f\n",originalCake->Price());
    //加蛋鸡蛋灌饼
    EggAddCake *eggAddCake = new EggAddCake(new OriginalCake);
    eggAddCake->Info();
    printf("\n Price %.2f\n",eggAddCake->Price());
    //加蛋加肠鸡蛋灌饼
    SausageAddCake *sausageAddCake = new SausageAddCake(new EggAddCake(new OriginalCake));
    sausageAddCake->Info();
    printf("\n Price %.2f\n",sausageAddCake->Price());
    //加肠鸡蛋灌饼
    SausageAddCake *sausageAddCake1 = new SausageAddCake();
    sausageAddCake1->Info();
    printf("\n Price %.2f\n",sausageAddCake1->Price());
    return a.exec();
}

输出结果

补充说明

如果需要专栏所有设计模式的源代码请留言留下你的联系方式,若能点赞、关注就更棒了!!!
本篇博客中的代码均已通过编译,如有Bug,请提出宝贵意见~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《图解23种设计模式pdf》是一本以图解方式呈现的设计模式学习资料。本书通过图文并茂的方式,详细介绍了23种常用的设计模式,对于初学者来说非常友好。 设计模式是软件开发领域中常用的设计思想和经验总结。通过学习设计模式,可以帮助我们更好地理解和应用面向对象设计的原则和理念。而这本《图解23种设计模式pdf》通过图解的形式,将抽象的设计概念用简单易懂的方式呈现出来,让初学者更容易理解和学习。 这本书从创建型、结构型和行为型三个方面介绍了各种设计模式。创建型设计模式包括单例模式、工厂模式、建造者模式等,用于对象的创建和初始化;结构型设计模式包括适配器模式、装饰器模式、代理模式等,用于对象的组合和组织;行为型设计模式包括观察者模式、策略模式、迭代器模式等,用于对象之间的相互作用。 每一种设计模式都有详细的图解和示例代码。通过学习这些图解和代码示例,我们可以更好地理解每个设计模式的应用场景和实现方式。同时,这本书也给出了每个设计模式的优缺点和适用情况,帮助读者更好地选择和应用设计模式。 总之,《图解23种设计模式pdf》是一本非常实用的设计模式学习资料。无论是对于初学者还是有经验的开发者来说,这本书都能够帮助我们更好地理解和应用设计模式,提高软件开发的质量和效率。 ### 回答2: 《图解23种设计模式PDF》是一本简洁清晰的设计模式入门指南。这本书通过图解的方式,详细介绍了23种常见的设计模式,让读者能够更加直观地理解和使用这些模式。 首先,这本书对设计模式进行了系统的分类和组织,可以帮助读者更好地理解各种模式之间的关系。书中将设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都有一个独特的图解和相应的示例代码,使读者能够更容易地理解这些模式的原理和应用场景。 其次,这本书特别注重实际应用。每个设计模式都有对应的实际案例,并且通过示例代码对其进行了详细解释。通过这些案例,读者可以了解如何使用设计模式解决真实世界中的问题,并学会将其应用于自己的项目中。 此外,这本书还提供了一些设计模式的最佳实践和注意事项。这些内容对于读者在使用设计模式时具有指导作用,并能帮助读者避免一些常见的错误。 总之,《图解23种设计模式PDF》是一本适合初学者的设计模式入门指南。通过图解和实例,读者可以快速掌握各种设计模式的原理和应用,并学会将其灵活运用于自己的项目中。无论是想了解设计模式的基本概念,还是想提高自己的设计能力,这本书都是一个很好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值