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;
}
相关推荐
高晶2 小时前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶2 小时前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风5 小时前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观5 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu1 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL1 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803231 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw2 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ2 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料3 天前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt