装饰器模式是一种结构型设计模式,它允许在不改变原始对象的基础上动态地扩展其功能。这种模式通过将对象包装在装饰器类的对象中来实现,每个装饰器对象都包含一个原始对象,并可以在调用原始对象的方法之前或之后执行一些额外的操作。
装饰器模式通常用于以下情况:
- 在不修改现有代码的情况下扩展对象的功能:当你需要在不改变现有代码的情况下为对象添加新的功能时,装饰器模式是一种非常有用的方法。
- 避免使用子类继承:通过继承来扩展对象的功能可能会导致类爆炸(class explosion),而装饰器模式可以避免这种问题。
- 动态地添加或删除功能:由于装饰器可以在运行时动态地添加或删除功能,因此它提供了一种更灵活的方式来管理对象的功能。
#include <iostream>
#include <memory>
using namespace std;
/*
装饰器模式 Decorator
装饰器:主要是增加现有类的功能 但是:增加现有类的功能,还有一个方法,就新增一个子类
为了增强现有类的功能,通过实现子类的方式,重写接口,是可以完成功能,但是代码中有太多子类添加进来
*/
class Car
{
public:
virtual void show() = 0;
};
//三个实体汽车类
class Bmw : public Car
{
public:
void show()
{
cout << "这是一辆宝马汽车,低配" << endl;
}
};
class Aodi:public Car
{
public:
void show()
{
cout << "这是一辆奥迪汽车,低配" << endl;
}
};
class Benchi:public Car
{
public:
void show()
{
cout << "这是一辆奔驰汽车,低配" << endl;
}
};
//装饰器的基类
class CarDecorator:public Car
{
public:
CarDecorator(Car *c):pCar(c){}
virtual void show()
{
pCar->show();
}
private:
Car *pCar;
};
//装饰器1 自动驾驶
class ConcreteDecorator01:public Car
{
public:
ConcreteDecorator01(Car *c):pCar(c){}
void show()
{
pCar->show();
cout<<",自动驾驶"<<endl;
}
private:
Car *pCar;
};
//装饰器2 车载音乐
class ConcreteDecorator02:public Car
{
public:
ConcreteDecorator02(Car *c):pCar(c){}
void show()
{
pCar->show();
cout<<",车载音乐"<<endl;
}
private:
Car *pCar;
};
int main()
{
Car *pCar = new Benchi();
pCar->show();
cout<<endl;
//装饰器1
Car *pCar01 = new ConcreteDecorator01(new Bmw());
pCar01->show();
cout<<endl;
//装饰器2
Car *pCar02 = new ConcreteDecorator02(new Aodi());
pCar02->show();
return 0;
}