設計模式--結構型模式--裝飾者模式
//Structural Patterns--Decorator //結構型模式--裝飾者模式
//Component(抽象構件):給出一個抽象介面,以規範準備接收附加責任的物件。 //ConcreteComponent(具體構件):定義一個將要接收附加責任的類。 //Decorator(抽象裝飾類):持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。 //ConcreteDecorator(具體裝飾類):負責給構件物件新增上附加的責任。
//---------------------------------------------- //Component(抽象構件) class Stream { public: virtual void read() = 0; virtual void seek() = 0; virtual void write() = 0;
virtual ~Stream(){} };
//---------------------------------------------- //ConcreteComponent(具體構件) class FileStream : public Stream { public: virtual void read(){cout << "FileStream read." << endl;} virtual void seek(){cout << "FileStream seek." << endl;} virtual void write(){cout << "FileStream write." << endl;} }; class NetworkStream : public Stream { public: virtual void read(){cout << "NetworkStream read." << endl;} virtual void seek(){cout << "NetworkStream seek." << endl;} virtual void write(){cout << "NetworkStream write." << endl;} }; class MemoryStream : public Stream { public: virtual void read(){cout << "MemoryStream read." << endl;} virtual void seek(){cout << "MemoryStream seek." << endl;} virtual void write(){cout << "MemoryStream write." << endl;} };
//---------------------------------------------- //Decorator(抽象裝飾類) class DecoratorStream : public Stream { protected: Stream *pStream; public: DecoratorStream(Stream *st):pStream(st){}
virtual void read() = 0; virtual void seek() = 0; virtual void write() = 0;
virtual ~DecoratorStream(){} };
//---------------------------------------------- //ConcreteDecorator(具體裝飾類) class CryptoStream : public DecoratorStream { public: CryptoStream(Stream *st):DecoratorStream(st){}
virtual void read(){cout << "Crypto ." << endl;pStream->read();} virtual void seek(){cout << "Crypto" << endl;pStream->seek();} virtual void write(){cout << "Crypto" << endl;} };
class BufferedStream : public DecoratorStream { public: BufferedStream(Stream *st):DecoratorStream(st){}
virtual void read(){cout << "Buffered ." << endl;pStream->read();} virtual void seek(){cout << "Buffered" << endl;pStream->seek();} virtual void write(){cout << "Buffered" << endl;pStream->write();} }; class CryptoBufferedStream : public DecoratorStream { public: CryptoBufferedStream(Stream *st):DecoratorStream(st){}
virtual void read(){cout << "CryptoBuffered ." << endl;pStream->read();} virtual void seek(){cout << "CryptoBuffered" << endl;pStream->seek();} virtual void write(){cout << "CryptoBuffered" << endl;pStream->write();} };
//------------------------------------------------------------- //測試 void dpDecoratorTestMain() {
//--------------------------------------------------------- Stream *pFileStream = new FileStream(); Stream *pCryptoStream = new CryptoStream(pFileStream); Stream *pBufferedStream = new BufferedStream(pCryptoStream); Stream *pCryptoBufferedStream = new CryptoBufferedStream(pBufferedStream);
pFileStream->read();
pCryptoStream->read(); pBufferedStream->read(); pCryptoBufferedStream->read();
if(pFileStream) {delete pFileStream; pFileStream = NULL;} if(pCryptoStream) {delete pCryptoStream; pCryptoStream = NULL;} if(pCryptoBufferedStream) {delete pCryptoBufferedStream; pCryptoBufferedStream = NULL;}
//--------------------------------------------------------- return; }