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();
    };
    
    

    分析

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

    总结

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

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/hustcpp/p/11388374.html
Copyright © 2011-2022 走看看