6. 装饰器模式
目录
- 一、简介
- 二、类图
- 三、代码实现
- 3.1 设计类图
- 3.2 代码实现
一、简介
- 模式中的角色
- 装饰者(decorator):用来装饰别的对象的对象
- 被装饰者(decoratee):被装饰的对象
- 解决的问题
- 动态的给一个对象添加一些额外的功能和职责
二、类图
Component
:被装饰对象的抽象父类ConcreteComponent
:等待被装饰对象的实体类Decorator
:装饰品抽象父类ConcreteDecoratorA
:装饰品实体类
三、代码实现
3.1 设计类图
以不同型号的车的装饰品为例
3.2 代码实现
#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;
}