装饰者模式
装饰者模式(Decorator
)又叫包装模式,通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替代方案。
装饰模式就是把要添加的功能分别放到单独的类中,并让这个类中包含它要装饰的对象,当需要执行的时候,客户端可以有选择地、按顺序执的使用装饰功能包装的对象。
实用性
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
处理那些可以撤销的职责
当不能采用子类的方法进行扩充时,一种情况是,可能有大量的独立扩展,为支持每一种组合将产生大量的子类,使得子类数目爆炸性增长,另外一种可能是类的定义被隐藏,或类的定义不能用于生成子类。
装饰者模式代码实现:
//
// Created by andrew on 2020/11/17.
//
#include <iostream>
using namespace std;
class Car {
public:
virtual void show() = 0;
virtual ~Car() {
}
};
class RunCar : public Car {
public:
virtual void show() {
cout << "run car" << endl;
}
~RunCar() {
}
};
// 当传进来的是runcar的时候,就能实现在不继承runcar的情况下扩展runcar的功能
class SwimCarDirector : public Car {
public:
SwimCarDirector(Car *car) {
m_car = car;
}
~SwimCarDirector() {
}
void swim() {
cout << "swim" << endl;
}
virtual void show() {
m_car->show();
swim();
}
private:
Car *m_car;
};
// 当传进来的是runcar的时候,就能实现在不继承runcar的情况下扩展runcar的功能
class FlyCarDirector : public Car {
public:
FlyCarDirector(Car *car) {
m_car = car;
}
~FlyCarDirector() {
}
void fly() {
cout << "fly" << endl;
}
virtual void show() {
m_car->show();
fly();
}
private:
Car *m_car;
};
int main(int argc, char *argv[]) {
// 考点,虚基类虽然不能定义对象,但是能定义指针,指针指向子类
Car *mycar = NULL;
mycar = new RunCar;
mycar->show();
cout << "-------------------------" << endl;
// 修饰模式,将run car修饰之后就能飞了
FlyCarDirector *flyCar = new FlyCarDirector(mycar);
flyCar->show();
//
cout << "-------------------------" << endl;
SwimCarDirector *swimCar = new SwimCarDirector(mycar);
swimCar->show();
delete swimCar;
delete flyCar;
delete mycar;
cout << "decorator demo" << endl;
return 0;
}