策略模式代码练习~

装饰器模式

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

ex:


class Stream{
public:
    virtual char Read(int num) = 0;
    virtual void Write(int num) = 0;
};

class FileStream : public Stream{
public:
    virtual char Read(int num) {
        return ' ';
    }
    virtual void Write(int num) {
        return ;
    }
};

class NetworkStream :public Stream{
public:
    virtual char Read(int num) {
        return ' ';
    }
    virtual void Write(int num) {
        return ;
    }
};


//如果我需要进行加密
class CryptoFilesStream : public FileStream {
public:
    virtual char Read(int num) {
        //解密操作
        // ...
        FileStream::Read(num);
    }
    virtual void Write(int num) {
        //加密操作
        //...
        FileStream::Write(num);
    }
};

//添加缓冲区
class CryptoBufferFileStream : public FileStream{
    virtual char Read(int num) {
        //解密操作
        //缓冲操作
        // ...
        FileStream::Read(num);
    }
    virtual void Write(int num) {
        //加密操作
        //缓冲操作
        //...
        FileStream::Write(num);
    }
};

有两个基本的 FileStream, NetworkStream 他们分别封装了文件和网络的write和read, 之后我们需要对这些文件加密,还要对这个stream进行缓存,甚至更多的操作。
上面代码存在的问题 CryptoBufferFileStream 这个类实际上又要将crypto又要重新写一次,显然不好

可以看下面的实现:


//这里继承Stream 是为了统一接口
class CryptoFilesStream1 : public Stream {
    Stream* stream;
public:

    CryptoFilesStream1(Stream* stm){
        stream = stm;
    }

    virtual char Read(int num) {
        //解密操作
        // ...
        return stream->Read(num);
    }
    virtual void Write(int num) {
        //加密操作
        //...
        stream->Write(num);
        return ;
    }
};

class BufferedStream : public Stream{
    Stream* stream;
public:
    BufferedStream(Stream* stm){
        stream = stm;
    }

    virtual char Read(int num) {
        //缓存操作
        return stream->Read(num);
    }
    virtual void Write(int num) {
        //缓存操作
        stream->Write(num);
        return ;
    }
};

// 这样子我们可以BufferedStream构建的时候放入任何Stream
/*
    FileStream file_stream = FileStream();
    CryptoStream crypto_stream =  CryptoStream(&file_stream)
    auto buff_stream = BufferedStream(&crypto_stream);
 * */
//

定义一个Stream 的指针,这样子每一层stram只需要关系自己的内容。 这里可以联想到ogre。
这里CryptoFilesStream1, BufferedStream 都继承Stream是为了统一接口。
Stream* stream; 可以向上提,但是能不放在base 的sream 显然不适合,因为FileStreamNerworkStream 显然用不到它们。

我们可以重新添加一个类 DecoratorStream, 封装Stream

class DecoratorStream: public Stream{
protected:
    Stream* stream;
    DecoratorStream(Stream* stream){

    }
};

class CryptoFilesStream2 : public DecoratorStream {
public:

    CryptoFilesStream2(Stream* stm): DecoratorStream(stm){
    }

    virtual char Read(int num) {
        //解密操作
        // ...
        return stream->Read(num);
    }
    virtual void Write(int num) {
        //加密操作
        //...
        stream->Write(num);
        return ;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值