zoukankan      html  css  js  c++  java
  • c++以代理的方式来实现接口化编程

     

    假如你项目代码本身已经实现了很多的实体类,但并未采用接口,可以考虑以这种方式来实现接口化编程

    struct ITest
    {
        virtual void Test()=0;
    };
    
    class CTest
    {
    public:
        void Test() {}
    };
    
    class CTestProxy:public ITest
    {
        void Test() 
        {  
            m_object.Test();
        }
    protected:
        CTest m_object;
    };
    
    class TestObject
    {
    public:
        static void Demo()
        {
            ITest *pTest=new CTestProxy;
            pTest->Test();
        }
    };
    

    改过为模板化

    template<class T, class I>
    class CTestProxy:public I
    {
        void Test() 
        {  
            m_object.Test();
        }
    protected:
        T m_object;
    };
    

    再来看子类的实现

    struct ISubTest:public ITest
    {
        virtual void SubTest()=0;
    };
    
    class CSubTest:public CTest
    {
    public:
        void SubTest() {}
    };
    
    template<class T, class I>
    class CSubTestProxy:public CTestProxy<T,I>
    {
        void SubTest() 
        {  
            m_object.SubTest();
        }
    };
    

    此方法可以使用接口的形式重用原有实现代码

    实体类与接口交互

    struct ITest
    {
        virtual void Test()=0;
    
        virtual ITest* GetProxy()=0;
        virtual void SetProxy(ITest* pTest)=0;
    };
    
    class CTest
    {
    public:
        CTest()
        {
            m_pTest=NULL;
        }
        void Test() {  }
    
        ITest* GetProxy() { return m_pTest; }
        void SetProxy(ITest* pTest) { m_pTest=pTest; }
    
        template<class T>
        T* Get()
        {
            ITest* pProxy=GetProxy();
            T* pT=dynamic_cast<T*>(pProxy);
            return pT;
        }
    
    protected:
        ITest *m_pTest;
    };
    
    template<class T, class I>
    class CTestProxy:public I
    {
    public:
        CTestProxy()
        {
            SetProxy(this);
        }
    
        void Test() 
        {  
            m_object.Test();
        }
    
        ITest* GetProxy() { return m_object.GetProxy(); }
        void SetProxy(ITest* pTest) { m_object.SetProxy(pTest); }
    
    protected:
        T m_object;
    };
    

    添加一个指针便有了两边交互的能力

    外部类继承:

    需要将T m_object声明成为指针,该类并非为导出类,避免对外暴露实现

  • 相关阅读:
    原型1
    可参考的gulp资源
    手机端rem自适应布局实例
    页面变灰效果
    图片上传
    angular学习笔记
    远程页面调试
    drag
    真的了解JS么?
    发现意外之美
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/3408473.html
Copyright © 2011-2022 走看看