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声明成为指针,该类并非为导出类,避免对外暴露实现

  • 相关阅读:
    CSS 使用技巧
    CSS display
    CSS float
    .NET自动识别HttpWebResponse的编码及是否压缩
    通用权限管理系统基类中数据库的连接
    通用权限底层实现的记录软删除及表中应包含的基本字段
    最好用的兼容多种数据库通用高效的大数据分页功能
    水平权限漏洞的修复方案
    通用权限管理系统菜单展示的一个技巧
    IE11下用forms身份验证的问题
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/3408473.html
Copyright © 2011-2022 走看看