我有以下類:裝飾用於特定的子類
class Stream {};
class FileStream : public Stream {};
class NetworkStream : public Stream {};
每個類都有一個write()
方法(虛擬)。
我可以在兩種類型的介質上使用FileStream:HDD和SSD。如果我正在寫入硬盤,我不會對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();
這會是一個合適的解決方案?任何人都可以想出更好的方法嗎?
只要你正在創建類,爲什麼不是'SSDFileStream'和'HDDFileStream'? – Xymostech 2013-04-24 15:07:53
你也可以從FileStream派生新的類,覆蓋寫入方法並從內部調用基本方法=>不需要成員變量然後...但要注意虛擬性 – Incubbus 2013-04-24 15:08:03
需要什麼樣的邏輯SDD,而不是在HDD上? – didierc 2013-04-24 15:29:45