概念
对于我们已经做好程序如果需要增加某些功能或者扩展的话会有以下两个方法:
1.重写接口,可以完成功能扩展的,但是代码中有太多的子类添加进来了。
2.通过子类实现功能增强的问题:为了增强现有类的功能,通过实现子类的方式。
因此就出现了装饰器模式。
装饰器模式 Decorator:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
Decorator模式结构图
Component:定义一个对象接口,可以给这些对象动态地添加职责。
ConcreteComponent:定义了一个具体的对象,也可以给这个对象添加一些职责。
Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能。但对于Component来说,是无需知道Decorator的存在的。
ConcreteDecorator:就是具体的装饰对象,起到给Component添加职责的功能。
代码实现
class Component
{
public:
virtual void Operator() = 0;
};
class ConcreteComponent : public Component
{
public:
void Operator()
{
cout << "具体对象的动作" << endl;
}
};
class Decorator : public Component
{
public:
Decorator(Component *c) : com(c) {}
virtual void Operator()
{
if (com != nullptr)
{
com->Operator();
}
}
private:
Component *com;
};
class ConcreteDecorator : public Decorator
{
public:
ConcreteDecorator(Component *c) : Decorator(c) {}
virtual void Operator()
{
cout << "额外增加的功能" << endl;
}
private:
Component *com;
};
int main()
{
Component *p = new ConcreteComponent();
Decorator *de = new ConcreteDecorator(p);
de->Operator();
delete de;
delete p;
return 0;
}
具体实际例子的代码实现
在具体买车的时候,高端车都会让客户自己给爱车增加配置,选择座椅材质,车身颜色,等等,然后厂商会根据客户所定制的需求去定做一台相应的车型
class Car
{
public:
virtual void show() = 0;
};
class Bmw : public Car
{
public:
void show()
{
cout << "这是一辆宝马,配置有:基本配置" ;
}
};
class Audi : public Car
{
public:
void show()
{
cout << "这是一辆奥迪,配置有:基本配置" ;
}
};
class Benz : public Car
{
public:
void show()
{
cout << "这是一辆奔驰,配置有:基本配置";
}
};
//装饰器1 定速巡航
class Decorator01 : public Car
{
public:
Decorator01(Car *c) : car(c) {}
void show()
{
car->show();
cout << ",定速巡航";
}
private:
Car *car;
};
//装饰器2 自动刹车
class Decorator02 : public Car
{
public:
Decorator02(Car *c) : car(c) {}
void show()
{
car->show();
cout << ",自动刹车";
}
private:
Car *car;
};
//装饰器3 车道偏离
class Decorator03 : public Car
{
public:
Decorator03(Car *c) : car(c) {}
void show()
{
car->show();
cout << ",车道偏离";
}
private:
Car *car;
};
int main()
{
Car *bmw = new Bmw();//基本配置
//增加想要的配置
bmw = new Decorator01(bmw);
bmw = new Decorator02(bmw);
bmw = new Decorator03(bmw);
bmw->show();
cout << endl;
Car *audi = new Audi();
audi = new Decorator02(audi);
audi->show();
cout << endl;
Car *benz = new Benz();
benz = new Decorator03(benz);
benz->show();
cout << endl;
return 0;
}