目录
一、简介
- 模式中的角色
- 装饰者(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;
}