1. 程式人生 > >設計模式--結構型模式--裝飾者模式

設計模式--結構型模式--裝飾者模式

//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; }