装饰器模式(Decorator Pattern)
装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构
,它是作为现有的类的一个包装。
以我们之前的Car为例,假设三种汽车我们需要给他们加上定速巡航或者自动刹车的功能,那么我们就需要通过实现子类的方式,重写接口
,每增加一个功能,不同的车型都需要增加一个子类,这样理论上是可以完成功能的,但是代码中有太多的子类添加进来
了。
动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比新增加子类实现更为灵活
。
使用时机: 在不想添加子类的情况下扩展类功能
解决方案: 将具体功能职责划分,同时继承装饰器模式。
class Car
{
public:
virtual void show() = 0;
};
class BWM :public Car
{
public:
void show() { cout << "this is BWM Car " ; }
};
class Audi :public Car
{
public:
void show() { cout << "this is Audi Car " ; }
};
装饰器通过和产品继承自一个基类
来达到不断对其修饰,针对一个自基类继承的方法,先是调用自身所指向的汽车对象,然后在后面写上所要增加的功能:
class CarDecorator :public Car
{
public:
CarDecorator(Car* p) :pCar_(p) {}
void show() = 0;
private:
Car* pCar_;
};
//装饰器1:定速巡航
class ConcreteDecorator01 :public Car
{
public:
ConcreteDecorator01(Car* p) :pCar_(p) {}
void show()
{
pCar_->show();
cout << "with curise control ";
}
private:
Car* pCar_;
};
//装饰器2:自动涉车
class ConcreteDecorator02:public Car
{
public:
ConcreteDecorator02(Car* p) :pCar_(p) {}
void show()
{
pCar_->show();
cout << "with Automatic car involved ";
}
private:
Car* pCar_;
};
int main()
{
Car* p1 = new ConcreteDecorator01(new BWM());
Car* p2 = new ConcreteDecorator02(new Audi());
p1->show();
cout<<endl;
p2->show();
cout<<endl;
}
运行结果如下: