在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例:
一、QIODevice装饰体系(继承方式)
场景
为基础IO设备(如文件、缓冲区)添加数据格式解析、缓冲优化等功能。
类图(Mermaid)
代码示例:QBufferedStream装饰QFile
// 基础构件:文件设备
QFile* file = new QFile("data.txt");
file->open(QIODevice::ReadWrite);// 装饰器:添加缓冲功能
QBufferedStream bufferedStream(file);
bufferedStream.write("Hello, Decorator!"); // 缓冲写入
bufferedStream.flush(); // 手动刷新缓冲区
二、QDataStream与QTextStream(组合方式)
场景
为QIODevice添加二进制数据解析或文本格式化功能。
类图(Mermaid)
代码示例:QDataStream装饰QBuffer
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);// 装饰器:写入二进制数据
QDataStream dataStream(&buffer);
dataStream << QString("Qt") << quint32(6.5); // 自动序列化// 读取装饰后的数据
buffer.seek(0);
QString str;
quint32 version;
dataStream >> str >> version; // 自动反序列化
三、QPainterPathStroker(图形装饰)
场景
为QPainterPath添加轮廓描边功能。
类图(Mermaid)
代码示例:绘制路径轮廓
QPainterPath path;
path.moveTo(0, 0);
path.lineTo(100, 100);// 装饰器:生成轮廓路径
QPainterPathStroker stroker;
stroker.setWidth(5); // 描边宽度
QPainterPath strokePath = stroker.stroke(path); // 原路径被装饰// 绘制原始路径和轮廓
QPainter painter(this);
painter.drawPath(path); // 细线
painter.drawPath(strokePath); // 粗轮廓
四、装饰模式在Qt中的特点
-
接口一致性
继承自QIODevice的装饰器(如QBufferedStream)与原始设备具有相同接口,可透明替换。 -
功能叠加
支持多层装饰:QFile file; QBufferedStream buf(&file); QDataStream data(&buf); // 双重装饰
-
组合 vs 继承
- 继承方式(如QBufferedStream):通过重写函数扩展行为。
- 组合方式(如QDataStream):通过包装对象提供新接口。
总结
Qt在IO模块和图形模块中广泛使用装饰模式,既保证了底层设备的通用性,又通过灵活的装饰器实现了功能扩展。这种设计符合开闭原则,是学习结构型设计模式的经典案例。