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