设计模式(五)decorator

来源:互联网 发布:淘宝联盟怎么满减 编辑:程序博客网 时间:2024/06/10 14:38

1.使用场景:需要很多的继承来拓展对象的功能,子类之间静态特质代码大量重复

2.理论依据:多态、虚函数

3.定义:动态(组合)地给一个对象增加额外的职责,decorator模式比生成子类
更为灵活(消除重复代码+减少子类个数)

4.步骤:使用基类指针,将继承改为组合模式
继承基类的同时,组合基类

5.技法:继承->组合
编译时装配->运行时装配(多态)

6.变化:拓展的功能
不变:每个拓展功能对应的操作

原代码:

//业务操作class Stream{public:    virtual char Read(int number)=0;    virtual void Seek(int position)=0;    virtual void Write(char data)=0;        virtual ~Stream(){}};//主体类class FileStream: public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual void Seek(int position){        //定位文件流    }    virtual void Write(char data){        //写文件流    }};class NetworkStream :public Stream{public:    virtual char Read(int number){        //读网络流    }    virtual void Seek(int position){        //定位网络流    }    virtual void Write(char data){        //写网络流    }    };class MemoryStream :public Stream{public:    virtual char Read(int number){        //读内存流    }    virtual void Seek(int position){        //定位内存流    }    virtual void Write(char data){        //写内存流    }    };//扩展操作class CryptoFileStream :public FileStream{public:    virtual char Read(int number){               //额外的加密操作...        FileStream::Read(number);//读文件流            }    virtual void Seek(int position){        //额外的加密操作...        FileStream::Seek(position);//定位文件流        //额外的加密操作...    }    virtual void Write(byte data){        //额外的加密操作...        FileStream::Write(data);//写文件流        //额外的加密操作...    }};class CryptoNetworkStream : :public NetworkStream{public:    virtual char Read(int number){                //额外的加密操作...        NetworkStream::Read(number);//读网络流    }    virtual void Seek(int position){        //额外的加密操作...        NetworkStream::Seek(position);//定位网络流        //额外的加密操作...    }    virtual void Write(byte data){        //额外的加密操作...        NetworkStream::Write(data);//写网络流        //额外的加密操作...    }};class CryptoMemoryStream : public MemoryStream{public:    virtual char Read(int number){                //额外的加密操作...        MemoryStream::Read(number);//读内存流    }    virtual void Seek(int position){        //额外的加密操作...        MemoryStream::Seek(position);//定位内存流        //额外的加密操作...    }    virtual void Write(byte data){        //额外的加密操作...        MemoryStream::Write(data);//写内存流        //额外的加密操作...    }};class BufferedFileStream : public FileStream{    //...};class BufferedNetworkStream : public NetworkStream{    //...};class BufferedMemoryStream : public MemoryStream{    //...}class CryptoBufferedFileStream :public FileStream{public:    virtual char Read(int number){                //额外的加密操作...        //额外的缓冲操作...        FileStream::Read(number);//读文件流    }    virtual void Seek(int position){        //额外的加密操作...        //额外的缓冲操作...        FileStream::Seek(position);//定位文件流        //额外的加密操作...        //额外的缓冲操作...    }    virtual void Write(byte data){        //额外的加密操作...        //额外的缓冲操作...        FileStream::Write(data);//写文件流        //额外的加密操作...        //额外的缓冲操作...    }};void Process(){        //编译时装配    CryptoFileStream *fs1 = new CryptoFileStream();    BufferedFileStream *fs2 = new BufferedFileStream();    CryptoBufferedFileStream *fs3 =new CryptoBufferedFileStream();}

decorator设计模式代码:

//业务操作class Stream{public:    virtual char Read(int number)=0;    virtual void Seek(int position)=0;    virtual void Write(char data)=0;        virtual ~Stream(){}};//主体类class FileStream: public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual void Seek(int position){        //定位文件流    }    virtual void Write(char data){        //写文件流    }};class NetworkStream :public Stream{public:    virtual char Read(int number){        //读网络流    }    virtual void Seek(int position){        //定位网络流    }    virtual void Write(char data){        //写网络流    }    };class MemoryStream :public Stream{public:    virtual char Read(int number){        //读内存流    }    virtual void Seek(int position){        //定位内存流    }    virtual void Write(char data){        //写内存流    }    };//扩展操作DecoratorStream: public Stream{protected:    Stream* stream;//...        DecoratorStream(Stream * stm):stream(stm){        }    };class CryptoStream: public DecoratorStream { public:    CryptoStream(Stream* stm):DecoratorStream(stm){        }            virtual char Read(int number){               //额外的加密操作...        stream->Read(number);//读文件流    }    virtual void Seek(int position){        //额外的加密操作...        stream::Seek(position);//定位文件流        //额外的加密操作...    }    virtual void Write(byte data){        //额外的加密操作...        stream::Write(data);//写文件流        //额外的加密操作...    }};class BufferedStream : public DecoratorStream{        Stream* stream;//...    public:    BufferedStream(Stream* stm):DecoratorStream(stm){            }    //...};void Process(){    //运行时装配    FileStream* s1=new FileStream();        CryptoStream* s2=new CryptoStream(s1);        BufferedStream* s3=new BufferedStream(s1);        BufferedStream* s4=new BufferedStream(s2);        }



原创粉丝点击