我有以下课程:
class Stream {};
class FileStream : public Stream {};
class NetworkStream : public Stream {};
每个类都有一个write()
方法(虚拟)。
我可以在两种类型的媒体上使用 FileStream:HDD 和 SSD。如果我正在写入 HDD,我不会对FileStream
已经提供的内容做任何特别的事情。但是,如果我正在编写 SSD,则在调用之前需要执行一些逻辑write()
。从内部FileStream
,我不知道我正在写信给什么媒体。只有呼叫站点知道。我想在这里使用装饰器,但装饰器旨在用于所有流。我只想NetworkStream
在某些情况下扩展 的功能。某种形式的装饰器在这里合适吗?如果不是,我应该使用什么设计模式?如果我们假设FileStream::write()
简单地将整个内部缓冲区刷新到文件并将其保存到磁盘,那么装饰器将需要在写入之前将一些元数据写入流。
我想创建一个不使用继承的简单装饰器类,如下所示:
class FileStreamDecorator
{
public:
FileStreamDecorator( FileStream& stream ) : m_stream( stream ) {}
void write() {
m_stream << "Some Metadata";
m_stream.write();
}
private:
FileStream& m_stream;
};
它会像这样使用:
FileStream stream;
stream << "Complete file data";
// At this point we know we are writing to SSD, so we must use the decorator
FileStreamDecorator decorator( stream );
decorator.write();
这会是一个合适的解决方案吗?谁能想到更好的方法?