一、装饰器介绍
1)装饰器作用
允许向一个现有的对象添加新的功能,同时又不改变结构,属于结构性模式,作为现有类的一个包装
2)目的
动态的给一个对象附加额外的职责,就增加功能来说,装饰器模式比生成子类更加灵活
3)优点
1)装饰类和被装饰类是相互独立的,不会相互耦合
2)装饰器是继承的一个模式,就是动态扩展一个类的功能,通过使用不同装饰类及这些装饰类的排列组合,可以实现不同的效果
3)装饰器模式完全遵循“开闭原则”
4)缺点
1)装饰器模式会增加许多子类,过度使用会增加程序的复杂性
5)使用场景
1)当需要给一个现有类添加附加职责
,而又不能采用生成子类的方法进行扩充
时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
2)当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现。
3)当对象的功能要求可以动态地添加,也可以再动态地撤销
6)UML图
二、代码
- main.cpp
#include "decoration.h"
int main()
{
Car car;
DecorateLED ledCar(&car);
//DecoratePC pcCar(&car);
ledCar.Configuration();
//pcCar.Configuration();
return 0;
}
- Decoration.h
#include <iostream>
using namespace std;
//抽象组件角色
class CComponent
{
public:
CComponent(){}
virtual ~CComponent(){}
virtual void Configuration() = 0;
};
//具体组件类
class Car:public CComponent
{
public:
Car()
{
std::cout<<"执行了car的构造函数"<<std::endl;
}
void Configuration() override
{
std::cout<<"执行了car的Configuration函数"<<std::endl;
}
};
//装饰角色:持有一个组件对象car的实力,并实现一个与抽象组件接口一直的接口Configuration
class DecorateCar:public CComponent
{
public:
DecorateCar(CComponent* car)
:_car(car)
{
std::cout<<"执行了DecorateCar构造函数"<<std::endl;
}
void Configuration() override
{
std::cout<<"执行DecorateCar的Configuration()函数"<<std::endl;
_car->Configuration();
}
private:
CComponent* _car;
};
//具体装饰角色:负责给对象组件对象添加额外的责任
class DecorateLED:public DecorateCar
{
public:
DecorateLED(CComponent* car)
:DecorateCar(car)
{
std::cout<<"执行了DecorateLED的构造函数"<<std::endl;
}
void Configuration() override
{
DecorateCar::Configuration();
AddLED();
}
private:
void AddLED()
{
std::cout<<"...AddLED..."<<std::endl;
}
};
//具体装饰角色:负责给组件对象添加额外的责任
class DecoratePC:public DecorateCar
{
public:
DecoratePC(CComponent* car)
:DecorateCar(car)
{
}
void Configuration() override
{
DecorateCar::Configuration();
AddPC();
}
private:
void AddPC()
{
std::cout<<"...AddPC..."<<std::endl;
}
};