十分钟学会一个设计模式---结构模式---装饰器模式(Decorator Pattern)

89 阅读1分钟

一、解决的问题

过度使用继承来扩展对象功能,随着子类增多,各种子类组合导致子类数量膨胀

二、未使用装饰者

image.png 子类数量过多

class Stream {
public:
    virtual bool Read() = 0;
    virtual ~Stream() = default;
};

class FileStream : public Stream {
public:
    virtual bool Read() override {}
};

class CryptoFileStream : public FileStream {
public:
    bool Read() override{
        // 加密
        FileStream::Read();
    }
};

三、使用装饰者

image.png

class Stream {
public:
    virtual bool Read() = 0;
    virtual ~Stream() = default;
};

class FileStream : public Stream {
public:
    virtual bool Read() override {}
};

class DecoratorStream : public Stream {
protected:
    Stream* m_stream;
    DecoratorStream(Stream* stream):m_stream(stream){}
    ~DecoratorStream() {
        if (!m_stream) {
            delete m_stream;
            m_stream = nullptr;
        }
    }
};

class CryptoStream : public DecoratorStream {
public:
    CryptoStream(Stream* stream): DecoratorStream(stream){}
    bool Read() {
        // 加密
        m_stream->Read();
    }
};

int main() {
    FileStream* s1 = new FileStream();
    CryptoStream* s2 = new CryptoStream(s1);
    s2->Read();
    delete s2;
    delete s1;
}

四、参考文章

blog.csdn.net/u012011079/…