动机:
在某些情况下我们可能会"过度地使用继承来扩展对象的功能”由于继承为类型引入的静态特质,使得这种拓展方式缺乏灵活性;
并且随着子类的增多(拓展功能的增多)",各种子类的组合(拓展功能的组合)会导致更多子类的膨胀。
如何使"对象功能的拓展"能够根据需要来动态实现?同时避免"拓展功能的增多"带来的子类膨胀问题?
从而使得任何"功能拓展变化"所导致的影响将为最低?
// 基类
class Stream{
public:
virtual char Read(intlength) = 0;
virtual void Seek(intpositoin) = 0;
virtual void Write(chardata) = 0;
virtual ~Stream(){}
}
// 原有业务类1
class FileStream : public Stream{
public:
virtual char Read(int length){}
virtual void Seek(int positoin){}
virtual void Write(char data){}
}
// 原有业务类2
class NetWorkStream : public Stream{
public:
virtual char Read(int length){}
virtual void Seek(int positoin){}
virtual void Write(char data){}
}
//拓展类,继承基类而不是业务类, 将基类作为成员变量,由运行时决定子类的类型。
class DecoratorStream: public Stream{
protected:
Stream * stream; // 定义基类的指针,子类多态调用public:
DecoratorStream(Stream *stm):stream(stm)//基类构造器 {
}
}
//拓展业务类,如加密
class CrytoStream: public DecoratorStream{
public:
CrytoStream(Stream * stm):DecoratorStream(stm){
}
virtual char Read(int length){
//拓展功能在这添加...stm->read(length)
}
virtual void Seek(int positoin){
//拓展功能在这添加...stm->Seek(positoin)
}
virtual void Write(char data){
//拓展功能在这添加...stm->Write(data)
}
}
//拓展业务类2,如加密
class NetCrytoStream: public DecoratorStream{
public:
CrytoStream(Stream * stm):DecoratorStream(stm){
}
virtual char Read(int length){
//拓展功能在这添加...stm->read(length)
}
virtual void Seek(int positoin){
//拓展功能在这添加...stm->Seek(positoin)
}
virtual void Write(char data){
//拓展功能在这添加...stm->Write(data)
}
}
//装配使用
void Process()
{
// fstream 与 cryStream 相互独立且不干扰。
FileStream *fstream = new FileStream();
fstream->read(size); //原有读功能。
CrytoStream *cryStream = new CrytoStream(fstream);
cryStream->read(size); //原有读功能 + 拓展功能
}