C++25设计模式之装饰者模式

在这里插入图片描述
图片引用于百度

简介:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性地替代方案。。

优点:能够动态的将新功能加在对象上,相比继承更加弹性

缺点:使用装饰模式会产生比继承更多的对象,查错比较困难

例子背景:现在需要组装一台电脑主机,而主机的各个部件都不相同,我们需要根据不同的主机构建不同的部件,然后组装它

概念:动态给对象增加功能,从一个对象的外部来给对象添加功能,当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列的装饰器装饰过后的对象

装饰者模式代码:

  • 被装饰的基类:
#pragma once
#include <string>
#include <iostream>
using namespace std;

class Mainframe
{
public:
        Mainframe() {}
        virtual ~Mainframe() {}
        virtual string GetName() { return m_name; }
        virtual double GetPrice() = 0;
protected:
        string m_name;
};
  • 被装饰的类:
#pragma once
#include "Mainframe.h"

class i7Mainframe : public Mainframe
{
public:
        i7Mainframe()
        {
                m_name.append("i7主机");
        }
        virtual ~i7Mainframe() {}
        virtual double GetPrice()
        {
                return m_price;
        }
private:
        double m_price = 11899;
};
  • 装饰者基类:
#pragma once
#include "Mainframe.h"

class Accessories : public Mainframe
{
public:
        Accessories(Mainframe* mf) : m_mainframe(mf) {}
        virtual ~Accessories() { delete m_mainframe; }
        virtual string GetName() = 0;
protected:
        Mainframe* m_mainframe = nullptr;
};
  • 装饰者类1:
#pragma once
#include "Accessories.h"

class AccessoriesHardDisk : public Accessories
{
public:
        AccessoriesHardDisk(Mainframe* mf) : Accessories(mf) {}
        ~AccessoriesHardDisk() {}
        virtual string GetName()
        {
                return m_mainframe->GetName().append("  加1t机械硬盘");
        }
        virtual double GetPrice()
        {
                return m_mainframe->GetPrice() + 399;
        }
};
  • 装饰者类2:
#pragma once
#include "Accessories.h"

class AccessoriesMemoryBank : public Accessories
{
public:
        AccessoriesMemoryBank(Mainframe* mf) : Accessories(mf) {}
        ~AccessoriesMemoryBank() {}
        virtual string GetName()
        {
                return m_mainframe->GetName().append("  加16G内存条");
        }
        virtual double GetPrice()
        {
                return m_mainframe->GetPrice() + 1099;
        }
};
  • 引用:
#include "i7Mainframe.h"
#include "AccessoriesHardDisk.h"
#include "AccessoriesMemoryBank.h"

int main()
{
        Mainframe* i7 = new i7Mainframe;
        Mainframe* ahd = new AccessoriesHardDisk(i7);
        Mainframe* amb = new AccessoriesMemoryBank(ahd);
        cout << "产品:" << ahd->GetName() << "价格:" << ahd->GetPrice() << endl;
        cout << "产品:" << amb->GetName() << "价格:" << amb->GetPrice() << endl;

        Mainframe* al = new AccessoriesHardDisk(new AccessoriesMemoryBank(new i7Mainframe));
        cout << "产品:" << al->GetName() << "价格:" << al->GetPrice() << endl;

        delete amb;
        delete al;
        getchar();
        return 0;
}

总结:
装饰者模式(Decorator):装饰者模式可以更加灵活的为一个类增加功能,但是也造成了大量的类,增加了排除错误的难度

作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值