下面为装饰模式实现的demo,装饰模式中一定包含一个基类的指针
//*.hpp
#pragma once
#include <stdio.h>
class Stream //流基类
{
public:
//IO流接口
virtual char Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(int data) = 0;
//虚析构保证子类析构能被调用
virtual ~Stream(){}
};
//网络流
class NetworkStream :public Stream
{
public:
virtual char Read(int number)
{
printf("NetworkStream read\n");
}
virtual void Seek(int position)
{
printf("NetworkStream Seek\n");
}
virtual void Write(int data)
{
printf("NetworkStream Write\n");
}
};
//文件流
class FileStream :public Stream
{
public:
virtual char Read(int number)
{
printf("FileStream Read\n");
}
virtual void Seek(int position)
{
printf("FileStream Seek\n");
}
virtual void Write(int data)
{
printf("FileStream Write\n");
}
};
//内存流
class MemoryStream :public Stream
{
public:
virtual char Read(int number)
{
printf("MemoryStream Read\n");
}
virtual void Seek(int position)
{
printf("MemoryStream Seek\n");
}
virtual void Write(int data)
{
printf("MemoryStream Write\n");
}
};
//扩展操作
//中间类
class DecoratorStream :public Stream
{
protected:
Stream * stream;
DecoratorStream(Stream* str):stream(str)
{}
};
//加密
class CryptoStream :public DecoratorStream
{
public:
CryptoStream(Stream* str):DecoratorStream(str)
{}
virtual char Read(int number)
{
printf("CryptoStream Read\n");
stream->Read(number);
}
virtual void Seek(int number)
{
printf("CryptoStream Seek\n");
stream->Seek(number);
}
virtual void Write(int number)
{
printf("CryptoStream Write\n");
stream->Write(number);
}
};
//缓冲区
class bufferedStream :public DecoratorStream
{
public:
bufferedStream(Stream* str):DecoratorStream(str){}
virtual char Read(int number)
{
printf("bufferedStream Read\n");
stream->Read(number);
}
virtual void Seek(int number)
{
printf("bufferedStream Seek\n");
stream->Seek(number);
}
virtual void Write(int number)
{
printf("bufferedStream Write\n");
stream->Write(number);
}
};
#include "test.hpp"
int main()
{
FileStream * s1 = new FileStream();
printf("````````````````````````````file```````````````````````````````````\n");
s1->Read(1);
s1->Seek(1);
s1->Write(1);
printf("```````````````````````````````````````````````````````````````\n");
CryptoStream *s2 = new CryptoStream(s1);
s2->Read(1);
s2->Seek(1);
s2->Write(1);
printf("```````````````````````````````````````````````````````````````\n");
bufferedStream *s3 = new bufferedStream(s2);
s3->Read(1);
s3->Seek(1);
s3->Write(1);
printf("```````````````````````````````````````````````````````````````\n");
printf("```````````````````````````````````````````````````````````````\n");
}