#define INPUTSTREAM_H
class Inputstream{
public:
virtual void read()=0;
virtual ~Inputstream(){}
};
#endif
#ifndef FILE_INPUTSTREAM_H
#define FILE_INPUTSTREAM_H
#include "Inputstream.h"
#include <iostream>
class FileInputstream : public Inputstream{
public:
virtual void read();
virtual ~FileInputstream(){}
};
#endif
#include "FileInputstream.h"
using namespace std;
void FileInputstream::read(){
cout<<"read a byte."<<endl;
}
#ifndef BUFFERED_INPUTSTREAM_H
#define BUFFERED_INPUTSTREAM_H
#include "Inputstream.h"
#include <iostream>
class BufferedInputstream : public Inputstream{
public:
virtual void read();
virtual ~BufferedInputstream(){
delete insp;
}
virtual void readline();//add func.
BufferedInputstream(Inputstream*);
private:
Inputstream* insp;
};
#endif
#include "BufferedInputstream.h"
using namespace std;
BufferedInputstream::BufferedInputstream(Inputstream* ins):Inputstream(){
insp=ins;
}
void BufferedInputstream::read(){
insp->read();
}
void BufferedInputstream::readline(){
cout<<"read a line."<<endl;
}
#ifndef READER_DECORATOR_H
#define READER_DECORATOR_H
#include "Inputstream.h"
#include <iostream>
#include "BufferedInputstream.h"
class ReaderDecorator : public Inputstream{
public:
virtual void read();
virtual void readline();//
virtual void getlines();//
virtual ~ReaderDecorator(){
delete insp;
}
ReaderDecorator(BufferedInputstream*);
private:
BufferedInputstream* insp;
};
#endif
#include "ReaderDecorator.h"
using namespace std;
ReaderDecorator::ReaderDecorator(BufferedInputstream* ins):Inputstream(){
insp=ins;
}
void ReaderDecorator::read(){
insp->read();
}
void ReaderDecorator::readline(){
insp->readline();
}
void ReaderDecorator::getlines(){
cout<<"getlines...."<<endl;
}
#include "FileInputstream.h"
#include "BufferedInputstream.h"
#include "ReaderDecorator.h"
int main(){
Inputstream* fins=new FileInputstream;
fins->read();
//
BufferedInputstream* bufins=new BufferedInputstream(fins);
bufins->read();
bufins->readline();
//
ReaderDecorator* reader=new ReaderDecorator(bufins);
reader->read();
reader->readline();
reader->getlines();
//
delete reader;
return 0;
}