zoukankan      html  css  js  c++  java
  • 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();
    };
    
    

    分析

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

    总结

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

  • 相关阅读:
    MVC三层架构学习总结实例
    JSON & Ajax
    设计模式之单例模式
    设计模式之静态工厂方法
    Gitee 添加了ssh公钥还是需要账户和密码
    MySQL日期时间函数大全[转]
    session 注意事项
    session 入库2 垃圾回收机制
    session 入库的实现
    PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
  • 原文地址:https://www.cnblogs.com/hustcpp/p/11388374.html
Copyright © 2011-2022 走看看