包装模式(装饰者模式)
作用:包装模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
角色:
Component:定义一个对象接口,可以给这些对象动态地添加职责
ConcreteComponent:定义一个对象,可以给这个对象添加一些职责
Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口
ConcreteDecorator:向组建添加职责
动作:Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加动作。
示例
转自:https://blog.csdn.net/xyisv/article/details/98214485
代码与函数
Component:Car类
ConcreteComponent:TOYOTA、VOLOVO类
Decorator:Function类
ConcreteDecorator:Navigator、SelfDrive、VoiceControl类
代码
#include<iostream>
using namespace std;
/*
给定两种初始的汽车类,例如丰田和沃尔沃,
利用装饰模式分别给它们添加新的功能,
其中丰田可以导航和自动驾驶,沃尔沃可以导航和语音控制。
*/
class Car{//Component
public:
virtual void showInfo() = 0;
};
class TOYOTA: public Car{
public:
TOYOTA(){}
TOYOTA(string name){
this->name = name;
}
void showInfo(){
cout<<name<<endl;
}
private:
string name;
};
class VOLOVO: public Car{
public:
VOLOVO(){}
VOLOVO(string name){
this->name = name;
}
void showInfo(){
cout<<name<<endl;
}
private:
string name;
};
class Function: public Car{//Decorator
protected:
Car* car;
public:
void Decorate(Car* car){
this->car = car;
}
void showInfo(){
if(car != NULL)car->showInfo();
}
};
//其中丰田可以导航和自动驾驶,沃尔沃可以导航和语音控制。
class Navigator: public Function{
public:
void showInfo(){
cout<<"导航 ";
Function::showInfo();
}
};
class SelfDrive: public Function{
public:
void showInfo(){
cout<<"自动驾驶 ";
Function::showInfo();
}
};
class VoiceControl: public Function{
public:
void showInfo(){
cout<<"语音控制 ";
Function::showInfo();
}
};
//其中丰田可以导航和自动驾驶,沃尔沃可以导航和语音控制。
int main(){
Car* toyota = new TOYOTA("丰田卡罗拉");
Navigator* na = new Navigator();
SelfDrive* sd = new SelfDrive();
na->Decorate(toyota);
sd->Decorate(na);
sd->showInfo();
cout<<endl;
Car* volovo = new VOLOVO("沃尔沃S90");
Navigator* na2 = new Navigator();
VoiceControl* vc = new VoiceControl();
na2->Decorate(volovo);
vc->Decorate(na2);
vc->showInfo();
return 0;
}