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;
}
相关推荐
nnsix13 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756813 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏14 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood16 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师16 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek17 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix17 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix18 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896318 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面19 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑