装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式的主要优点有:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
装饰器模式的结构与实现
通常情况下,**扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。**如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。
cpp
#include <iostream>
// 通过装饰器增强类的功能
class Car{
public:
virtual void show()=0;
};
// 三个实体的汽车类
class Bmw:public Car{
public:
void show(){
std::cout<< "这是一辆宝马汽车,配置有:基本配置 " <<std::endl;
}
};
class Audi:public Car{
public:
void show(){
std::cout<< "这是一辆奥迪汽车,配置有:基本配置 " <<std::endl;
}
};
class Benz: public Car{
public:
void show(){
std::cout<< "这是一辆奔驰汽车,配置有:基本配置 " <<std::endl;
}
};
// 装饰器的基类
//class CarDecorator: public Car{
//public:
// CarDecorator(Car *p):pCar(p){
// }
// virtual void show()=0;
//private:
// Car *pCar;
//};
// 装饰器1
class ConcreteDecorator01 :public Car{
public:
ConcreteDecorator01(Car *p):pCar(p){}
void show(){
pCar->show();
std::cout<< "定速巡航" << std::endl;
}
private:
Car *pCar;
};
// 装饰器2
class ConcreteDecorator02 :public Car{
public:
ConcreteDecorator02(Car *p):pCar(p){}
void show(){
pCar->show();
std::cout<< "自动刹车" << std::endl;
}
private:
Car *pCar;
};
int main(){
Car *p1 = new ConcreteDecorator01(new Bmw());
p1 =new ConcreteDecorator02(p1);
p1->show();
Car *p2 = new ConcreteDecorator01(new Audi());
p2->show();
Car *p3 = new ConcreteDecorator01(new Benz());
p3->show();
}