c++ 装饰器模式/包装模式

理解

使用两个隔离又继承自统一接口类的对象:方法对象(抽象/具体), 包装器对象(抽象/具体)实现多种组合只需要 n + m种实现, 而对比直接继承,则需要n*m 种实现,因此在面对多种具体类和多种额外装饰(额外的操作)时,装饰器模式比较有用,举例说明:

实现流的普通和加解密
n是流: 文件流,网络流,控制台流, m是普通和加密
如果用直接继承的方法处理,则需要实现的对象有文件流普通,文件流加密,网络流普通和网络流加密,,控制台流普通,控制台流加密, 一共是3*2 = 4
而用装饰器模式, 则只需要实现两种流,两种包装器,3+2 = 5 

原因是因为装饰器模式使用运行时绑定

实现

方法类

class StreamBase{
    virtual void io() = 0; 
};

class FileStream:public StreamBase {
    void io(){
        // impletation
    }
};

class SocketStream:public StreamBase {
    void io(){
        // impletation
    }
};

class ConsoleStream:public StreamBase {
    void io(){
        // impletation
    }
};

包装类

class DecoderBase: public StreamBase {
public
    DecoderBase(StreamBase * ptr):m_functionbase(ptr){}

  void io(){
       m_functionbase->io();
    }

private:
    StreamBase* m_functionbase;
};

class NormalDecoder :public DecoderBase{
public:
    NormalDecoder (StreamBase * ptr):DecoderBase(ptr){}
    void io(){
        DecoderBase::io();
        normal();
    }
    
private:
    void normal();
};

class EncodeDecoder :public DecoderBase{
public:
    EncodeDecoder(StreamBase * ptr):DecoderBase(ptr){}
    void io(){
        DecoderBase::io();
        encode();
    }
    
private:
    void encode();
};

分析

包装器要继承方法接口的原因是统一接口。
包装器基类的作用是统一了数据,避免在每个基类里需要重复定义一个方法对象指针

总结

装饰器模式是比较有用的方法,比较灵活处理多变的情况,不过缺点是多重包装器比较复杂

原文地址:https://www.cnblogs.com/hustcpp/p/11388374.html