6. 装饰器模式

目录

一、简介

  • 模式中的角色
    • 装饰者(decorator):用来装饰别的对象的对象
    • 被装饰者(decoratee):被装饰的对象
  • 解决的问题
    • 动态的给一个对象添加一些额外的功能和职责

二、类图

  • Component:被装饰对象的抽象父类
  • ConcreteComponent:等待被装饰对象的实体类
  • Decorator:装饰品抽象父类
  • ConcreteDecoratorA:装饰品实体类

三、代码实现

3.1 设计类图

以不同型号的车的装饰品为例

3.2 代码实现

cpp 复制代码
#include <iostream>

class Car
{
protected:
    unsigned int cost;
    std::string description;

public:
    virtual std::string getDescription() = 0;

    virtual unsigned int getCost() = 0;
};

class A1Car : public Car
{
public:
    A1Car(unsigned int cost, const std::string& description)
    {
        this->cost = cost;
        this->description = description;
    }

    std::string getDescription()
    {
        return this->description;
    }

    unsigned int getCost()
    {
        return this->cost;
    }

};

class A4Car : public Car
{
public:
    A4Car(unsigned int cost, const std::string& description)
    {
        this->cost = cost;
        this->description = description;
    }

    std::string getDescription()
    {
        return this->description;
    }

    unsigned int getCost()
    {
        return this->cost;
    }
};

class Decorator : public Car
{
protected:
    Car* m_car;
    unsigned int dec_cost;  //配件的价格
    std::string dec_description; //配件的描述
public:

    virtual std::string getDescription()
    {
        return m_car->getDescription() + this->dec_description;
    }

    virtual unsigned int getCost()
    {
        return this->dec_cost + m_car->getCost();
    }
};

class GPS : public Decorator
{
public:
    GPS(unsigned int cost, const std::string& description, Car* obj)
    {
        //std::cout << "new GPS: " << cost << std::endl;
        this->dec_cost = cost;
        this->dec_description = description;
        this->m_car = obj;
    }
};

class Redar : public Decorator
{
public:
    Redar(unsigned int cost, const std::string& description, Car* obj)
    {
        //std::cout << "new Redar: " << cost << std::endl;
        this->dec_cost = cost;
        this->dec_description = description;
        this->m_car = obj;
    }

};

int main()
{
    Car* a1 = new A1Car(10000, "A1Car");
    std::cout << "a1 cost:" << a1->getCost() << "; description: " << a1->getDescription() << std::endl;

    Car* a4 = new A4Car(15000, "A4Car");
    std::cout << "a4 cost:" << a4->getCost() << "; description: " << a4->getDescription() << std::endl;
    
    //给a4一个GPS配置
    a4 = new GPS(101, ",by GPS(RMB: 101)", a4);

    //再给a4一个Redar配置
    a4 = new Redar(98, ",by redar(RMB: 98)", a4);

    std::cout << "===========a1没加附加组件,因此价格不变===============" << std::endl;
    std::cout << a1->getDescription() << ". Cost: " << a1->getCost() << std::endl;
    std::cout << "===========a4加了GPS和redar两个组件,因此相对较贵=====" << std::endl;
    std::cout << a4->getDescription() << ". Cost: " << a4->getCost() << std::endl;

    return 0;
}
相关推荐
沛沛老爹1 小时前
Web开发者进阶AI:Agent技能设计模式之迭代分析与上下文聚合实战
前端·人工智能·设计模式
Geoking.2 小时前
【设计模式】装饰者模式详解
设计模式·装饰器模式
vx-bot5556664 小时前
企业微信接口在自动化工作流中的关键角色与设计模式
设计模式·自动化·企业微信
Yu_Lijing4 小时前
基于C++的《Head First设计模式》笔记——工厂模式
c++·笔记·设计模式
HL_风神18 小时前
设计原则之迪米特
c++·学习·设计模式
HL_风神19 小时前
设计原则之合成复用
c++·学习·设计模式
Aeside121 小时前
揭秘 Nginx 百万并发基石:Reactor 架构与 Epoll 底层原理
后端·设计模式
帅气的你1 天前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式
阿里巴巴淘系技术团队官网博客1 天前
GenAI输出内容控制的5种设计模式
设计模式
沛沛老爹1 天前
Skills高级设计模式(一):向导式工作流与模板生成
java·人工智能·设计模式·prompt·aigc·agent·web转型