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;
}
相关推荐
phdsky6 小时前
【设计模式】策略模式
设计模式·策略模式
烛阴6 小时前
【TS 设计模式完全指南】构建你的专属“通知中心”:深入观察者模式
javascript·设计模式·typescript
Mr_WangAndy8 小时前
C++设计模式_创建型模式_原型模式Prototype
c++·设计模式·原型模式
哆啦code梦9 小时前
设计模式之代理模式-骆驼与巴巴羊的故事
设计模式·代理模式
贝塔实验室9 小时前
ADMM 算法的基本概念
算法·数学建模·设计模式·矩阵·动态规划·软件构建·傅立叶分析
Chan1610 小时前
【 设计模式 | 结构型模式 代理模式 】
java·spring boot·后端·设计模式·intellij-idea
大飞pkz14 小时前
【设计模式】适配器模式
开发语言·设计模式·c#·适配器模式
Meteors.14 小时前
23种设计模式——组合模式(Composite Pattern)
设计模式·组合模式
大飞pkz14 小时前
【设计模式】外观模式
开发语言·设计模式·c#·外观模式
青草地溪水旁14 小时前
设计模式(C++)详解——解释器模式(2)
c++·设计模式·解释器模式