装饰器模式:
装饰器模式动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰器模式比生成子类实现更为灵活。
装饰器模式实例之变形金刚:
从类图可以看出,Changer和Car都实现了Transform的move接口,且Changer有个transform的依赖注入,是用来指向Car的,从而装饰Car。
这次实例和以后的实例将会采用智能指针的形式,就不用自己去释放内存了 。
抽象构件类Transform:
//抽象构件类Transform
class Transform{
public:
virtual void move() = 0;
};
具体构件类Car:
//具体构件类Car
class Car : public Transform{
public:
Car(){
cout << "变形金刚是一辆车!" << endl;
}
void move(){
cout << "在陆地上移动。" << endl;
}
};
抽象装饰类:
//抽象装饰类
class Changer : public Transform{
public:
Changer(shared_ptr<Transform> transform){
this->transform = transform;
}
void move(){
transform->move();
}
private:
shared_ptr<Transform> transform;
};
具体装饰类Robot:
//具体装饰类Robot
class Robot : public Changer{
public:
Robot(shared_ptr<Transform> transform) : Changer(transform){
cout << "变成机器人!" << endl;
}
void say(){
cout << "说话!" << endl;
}
};
具体装饰类AirPlane:
//具体装饰类AirPlane
class Airplane : public Changer{
public:
Airplane(shared_ptr<Transform> transform) : Changer(transform){
cout << "变成飞机!" << endl;
}
void say(){
cout << "在天空飞翔!" << endl;
}
};
客户端测试 :
//客户端测试
int main(void){
shared_ptr<Transform> camaro = make_shared<Car>();
camaro->move();
cout << "--------------" << endl;
shared_ptr<Robot> bumblebee = make_shared<Robot>(camaro);
bumblebee->move();
bumblebee->say();
return 0;
}
输出结果:
(End)