简介:
是一种结构型模型,创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
也不想/不能继承已有功能,在子类扩展,那么装饰器应运而生。
应用场景:
举个例子,目前我所在的公司是为各大车厂做一些辅助驾驶功能的,基本是在L2级别的功能,比如HWP ACC AEB .
假设现在一些车厂找我们公司合作,希望将我们的某些辅助功能加到他们的车上:
0.汽车基类:
#include <iostream>
#include <memory>
class Car{
public:
Car(){}
virtual void ShowFunctions() = 0;
};
1.奇瑞汽车,已有HWP和ACC功能
class CherryCar:public Car{
void ShowFunctions(){
std::cout<<"now ,CherryCar functions is HWP ACC";
}
};
2.宝马汽车,已有HWP和AEB功能
class BMWCar:public Car{
void ShowFunctions(){
std::cout<<"now ,BMWCar functions is HWP AEB";
}
};
3.奥迪汽车,已有ACC和AEB功能
class AudiCar:public Car{
void ShowFunctions(){
std::cout<<"now ,AudiCar functions is ACC AEB";
}
};
此时,他们公司找到我们公司,希望能扩展他们的功能,展开一系列合作,再不改变他们公司代码的前提下,将我们功能添加上去,所以,我们公司实现了每个功能的装饰器类,来为他们添加新功能:
1.HWP功能装饰器类:
class HWPDecorator:public Car{
public:
HWPDecorator(Car *p):pcar_(p){}
void ShowFunctions(){
pcar_->ShowFunctions();
std::cout<<" HWP"<<std::endl;
}
private:
Car *pcar_;
};
2.ACC功能装饰器类:
class ACCDecorator:public Car{
public:
ACCDecorator(Car *p):pcar_(p){}
void ShowFunctions(){
pcar_->ShowFunctions();
std::cout<<" ACC"<<std::endl;
}
private:
Car *pcar_;
};
3.AEB功能装饰器类:
class AEBDecorator:public Car{
public:
AEBDecorator(Car *p):pcar_(p){}
void ShowFunctions(){
pcar_->ShowFunctions();
std::cout<<" AEB"<<std::endl;
}
private:
Car *pcar_;
};
使用:
int main(){
std::shared_ptr<Car> cherry = std::make_shared<AEBDecorator>(new CherryCar());
//AEBDecorator包装了原来的奇瑞汽车类,没有改变原来奇瑞汽车功能的code,下面同理
cherry->ShowFunctions();
std::shared_ptr<Car> bmw = std::make_shared<ACCDecorator>(new BMWCar());
bmw->ShowFunctions();
std::shared_ptr<Car> audi = std::make_shared<HWPDecorator>(new AudiCar());
audi->ShowFunctions();
return 0;
}
输出:
now ,CherryCar functions is HWP ACC AEB
now ,BMWCar functions is HWP AEB ACC
now ,AudiCar functions is ACC AEB HWP
当然,实际开发情景不会像现在一样简单明了,往往很复杂,这里就是为了把这个问题讲清楚,才想的这个例子,
假设这时其他的车厂找我们公司合作,他们也想要这些功能,我们是不是也可以用装饰的方式,添加到他们已有的项目功能中。