您的位置:首页 > 编程语言 > C语言/C++

c++以代理的方式来实现接口化编程

2013-11-05 14:13 393 查看
 

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

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声明成为指针,该类并非为导出类,避免对外暴露实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: