装饰器模式是一种结构型设计模式,它允许在不改变原始对象的基础上动态地扩展其功能。这种模式通过将对象包装在装饰器类的对象中来实现,每个装饰器对象都包含一个原始对象,并可以在调用原始对象的方法之前或之后执行一些额外的操作。
装饰器模式通常用于以下情况:
- 在不修改现有代码的情况下扩展对象的功能:当你需要在不改变现有代码的情况下为对象添加新的功能时,装饰器模式是一种非常有用的方法。
- 避免使用子类继承:通过继承来扩展对象的功能可能会导致类爆炸(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;//装饰器1Car *pCar01 = new ConcreteDecorator01(new Bmw());pCar01->show();cout<<endl;//装饰器2Car *pCar02 = new ConcreteDecorator02(new Aodi());pCar02->show();return 0;
}