设计模式4--decorator(装饰器模式)

decorator 装饰模式

decorator.png

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。重要的一点是装饰器既有基类的多态指针又继承于基类

/**
 * 流基类
 */
class stream
{
public:
    virtual void read()=0;
    virtual void write()=0;
    virtual void seek()=0;
};
/**
 * 文件流
 */
class fileStream : public stream
{
    virtual void read()
    {
        cout<<"文件读取"<<endl;
    }
    virtual void write()
    {
        cout<<"文件写"<<endl;
    }
    virtual void seek()
    {
        cout<<"文件随机"<<endl;
    }
};
/**
 * 网络流
 */
class netStream : public stream
{
    virtual void read()
    {
        cout<<"网络读取"<<endl;
    }
    virtual void write()
    {
        cout<<"网络写"<<endl;
    }
    virtual void seek()
    {
        cout<<"网络随机"<<endl;
    }
};
/*
 * 装饰器
 */
class decorator : public stream
{
public:
    decorator(stream* _st):st(_st){}
protected:
    stream* st;
};
//缓存装饰
class cacheDecorator : public decorator
{

public:
    cacheDecorator(stream* _st):decorator(_st){}
    virtual void read()
    {
        st->read();
        cout<<"缓存读"<<endl;
    }
    virtual void write()
    {
        st->write();
        cout<<"缓存写"<<endl;
    }
    virtual void seek()
    {
        st->seek();
        cout<<"缓存随机"<<endl;
    }
};
//加密装饰
class decryptDecorator : public decorator
{

public:
    decryptDecorator(stream* _st):decorator(_st){}
    virtual void read()
    {
        st->read();
        cout<<"加密读"<<endl;
    }
    virtual void write()
    {
        st->write();
        cout<<"加密写"<<endl;
    }
    virtual void seek()
    {
        st->seek();
        cout<<"加密随机"<<endl;
    }
};
#include <iostream>

using namespace std;
int main(int argc, char const *argv[]) {
    fileStream* file = new fileStream();
    netStream* net = new netStream();
    //缓存
    cacheDecorator* cache = new cacheDecorator(file);
    decryptDecorator* decript = new decryptDecorator(net);
    cache->read();
    cache->write();

    decript->read();
    decryptDecorator* decript1 = new decryptDecorator(cache);
    decript1->read();
    decript1->seek();
    return 0;
}

我觉得这个设计模式最重要的就是装饰器中既有基类的多态指针,又继承基类。让装饰器可以不断地改变对象功能并且保持对象不变。


decorator.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容