装饰器模式 结构型设计模式
优点:
- 它提供了一种灵活的替代方案来扩展一个类的功能,而不需要使用继承。
- 它允许你通过组合多个装饰器来动态地添加或删除功能。
缺点:
- 它可能会导致设计中出现大量的小类,增加了代码的复杂性。
- 如果过度使用,可能会导致代码变得难以理解和维护。
与组合模式的对比:
- 装饰器模式的目的是在不改变现有对象结构的情况下为对象添加新功能。它通常用于在运行时动态地扩展一个对象的功能。
- 而组合模式的目的是将对象组合成树形结构以表示部分-整体的层次关系,并使客户端能够以一致的方式处理单个对象和组合对象。
满足的设计原理:
- 单一职责原则:每个类都只负责一项职责。在装饰器模式中,每个装饰器类都只负责添加一种特定的行为或责任。
- 开闭原则:软件实体应该对扩展开放,对修改关闭。在装饰器模式中,你可以通过增加新的装饰器类来扩展系统,而无需修改现有的代码。
- 里氏替换原则:子类应该能够替换其父类。在装饰器模式中,装饰器类和被装饰的类都实现了相同的接口,因此客户端可以使用统一的接口来处理它们,而不需要关心它们的具体类型。
常用的实例:
- 图形用户界面:许多图形用户界面都使用了装饰器模式来动态地添加新的行为和样式。例如,你可以使用装饰器来给按钮添加边框、阴影和动画效果。
- 数据压缩:你可以使用装饰器模式来实现数据压缩功能。例如,你可以定义一个读取数据的类,然后使用装饰器来添加压缩和解压缩功能。
- 日志记录:你可以使用装饰器模式来实现日志记录功能。例如,你可以定义一个执行操作的类,然后使用装饰器来添加日志记录功能。
类图:
#include "iostream"
#include <string.h>
using namespace std;
class Component
{
public:
virtual void operation()=0;
};
class ConcreteComponent: public Component
{
public:
void operation()
{
cout<<"具体操作对象" << endl;
};
};
class Decorator : public Component
{
public:
void SetComponent(Component *component)
{
this->component=component;
}
void operation()
{
if (component)
{
this->component->operation();
}
};
protected:
Component *component;
};
class ConcreateDecoratorA :public Decorator{
public:
void operation()
{
Decorator::operation();
addedState = "new State";
cout << "ConcreateDecoratorA" << endl;
};
private:
string addedState;
};
class ConcreateDecoratorB :public Decorator {
public:
void operation()
{
Decorator::operation();
cout << "ConcreateDecoratorB" << endl;
};
};
int main()
{
ConcreteComponent*c=new ConcreteComponent;
ConcreateDecoratorA*a=new ConcreateDecoratorA;
ConcreateDecoratorB*b=new ConcreateDecoratorB;
a->SetComponent(c);
b->SetComponent(a);
b->operation();
return 0;
}