#ifndef __DECORATOR_H__
#define __DECORATOR_H__
#include <iostream>
using std::cout;
using std::endl;
class Stream {
public:
virtual void read() = 0;
virtual void write() = 0;
};
class FileStream : public Stream {
public:
virtual void read()
{
cout << "file read" << endl;
}
virtual void write()
{
cout << "file write" << endl;
}
};
class NetworkStream : public Stream {
public:
virtual void read()
{
cout << "network stream" << endl;
}
virtual void write()
{
cout << "network write" << endl;
}
};
class DecoratorStream : public Stream {
protected:
Stream* stream;
DecoratorStream(Stream* s)
: stream(s)
{
}
void read()
{
}
void write()
{
}
};
class BufferStream : public DecoratorStream {
public:
BufferStream(Stream* s)
:DecoratorStream(s)
{}
virtual void read()
{
stream->read();
cout << "buffer read" << endl;
}
virtual void write()
{
stream->read();
cout << "buffer write" << endl;
}
};
class CryptoStream : public DecoratorStream {
public:
CryptoStream(Stream* s)
:DecoratorStream(s)
{
}
void read()
{
stream->read();
cout << "crypto read" << endl;
}
void wirte()
{
stream->write();
cout << "crypto write" << endl;
}
};
void printDecorator()
{
FileStream* fs = new FileStream();
fs->read();
cout << "-----------------file read------------------------" << endl << endl;
CryptoStream* cs = new CryptoStream(fs);
cs->read();
cout << "-----------------crypto read------------------------" << endl << endl;
BufferStream* bs = new BufferStream(fs);
bs->read();
cout << "-----------------buffer read------------------------" << endl << endl;
BufferStream* bcs = new BufferStream(cs);
bcs->read();
cout << "-----------------buffer crypto read------------------------" << endl << endl;
}
#endif