装饰器模式是一种结构性设计模式,它允许在不改变现有对象结构的情况下,动态地将新行为添加到对象中。它通过将对象包装在具有相同接口的装饰器中,然后通过组合来添加新的功能或修改原始对象的行为。
装饰器模式的本质在于通过组合而非继承的方式来拓展对象的功能。它提供了一种灵活的方式来添加或修改对象的行为,同时遵循开闭原则。
#include <iostream>
#include <memory>
using namespace std;
class Car // 抽象基类
{
public:
virtual void show() = 0;
};
// 三个实体基类
class Bmw :public Car
{
public:
void show() { cout << "这是一辆宝马汽车,配置有:基本配置" << endl; }
};
class Audi :public Car
{
public:
void show() { cout << "这是一辆奥迪汽车,配置有:基本配置" << endl; }
};
class Benz :public Car
{
public:
void show() { cout << "这是一辆奔驰汽车,配置有:基本配置" << endl; }
};
// 装饰器的基类
class CarDecorator :public Car
{
public:
CarDecorator(Car *p):pCar(p) {}
private:
Car* pCar;
};
// 装饰器1 定速巡航
class ConcreteDecorator01 :public Car
{
public:
ConcreteDecorator01(Car* p) :pCar(p) {}
void show()
{
pCar->show();
cout << ",定速巡航";
}
private:
Car* pCar;
};
class ConcreteDecorator03 :public Car
{
public:
ConcreteDecorator03(Car* p) :pCar(p) {}
void show()
{
pCar->show();
cout << ",车道偏离";
}
private:
Car* pCar;
};
class ConcreteDecorator02 :public Car
{
public:
ConcreteDecorator02(Car* p) :pCar(p) {}
void show()
{
pCar->show();
cout << ",定速巡航";
}
private:
Car* pCar;
};
int main()
{
Car* p1 = new ConcreteDecorator01(new Bmw());
p1 = new ConcreteDecorator02(p1);
p1->show();
cout << endl;
Car* p2 = new ConcreteDecorator02(new Audi());
p2->show();
cout << endl;
Car* p3 = new ConcreteDecorator03(new Benz());
p3->show();
cout << endl;
return 0;
}