装饰器模式

动机:

在某些情况下我们可能会"过度地使用继承来扩展对象的功能”由于继承为类型引入的静态特质,使得这种拓展方式缺乏灵活性;
并且随着子类的增多(拓展功能的增多)",各种子类的组合(拓展功能的组合)会导致更多子类的膨胀。

如何使"对象功能的拓展"能够根据需要来动态实现?同时避免"拓展功能的增多"带来的子类膨胀问题?
从而使得任何"功能拓展变化"所导致的影响将为最低?

image

// 基类
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); //原有读功能 + 拓展功能    
}
posted @ 2019-06-26 21:49  osbreak  阅读(109)  评论(0编辑  收藏  举报