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

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

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

  1. 分布领域驱动设计(DDD):领域接口化设计式缓存的选择

    -     前言    - 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编 ...

  2. 领域驱动设计(DDD):领域接口化设计

    领域接口化设计 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编程.所以我们 ...

  3. 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)

    场景 若依官网: http://doc.ruoyi.vip/ 前提: 服务器上安装Mysql,并将数据库导入,在SpringBoot中的application-druid.yml配置mysql数据库连 ...

  4. MyBatis运行原理(三)接口式编程及创建代理对象原理分析

    一.面向接口开发步骤 定义代理接口,将操作数据库的方法定义在代理接口中. 在SQL 映射文件中编写SQL 语句. 将SQL 映射文件注册在MyBatis 的全局配置文件中. 编写测试代码. 二.环境准 ...

  5. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  6. php接口调用实例源代码,小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例...

    从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读 ...

  7. java多线程 -- 创建线程的第三者方式 实现Callable接口

    Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一 ...

  8. 13 计算机组成原理第七章 输入/输出系统 I/O方式 I/O接口

    文章目录 1 I/O接口 1.1 接口定义 1.2 I/O接口的功能(以单总线为例) 1.3 I/O接口的基本结构 1.4 接口与端口 1.5 I/O端口及其编址 1.6 I/O接口的类型 1.7 I ...

  9. HttpClient Get/Post方式调用Http接口

    HttpClient Get/Post方式调用Http接口 本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myecli ...

最新文章

  1. Ubuntu14.04安装JDK
  2. MacOS 安装monkey教程
  3. Python入门100题 | 第037题
  4. 分布式 RPC架构简单理解
  5. 关于女人强势表现和强势心理
  6. 浙江省经信委与新华三签署战略合作协议
  7. 获取SAP Spartacus当前显示产品json数据的又一办法
  8. ImportError: No module named google.protobuf.internal
  9. .net解决Xss攻击
  10. 显示隐藏-visibility(HTML、CSS)
  11. tcp连接时,BROKEN PIPE错误
  12. vue组件挂载到全局方法
  13. mysql 修改密码
  14. java刷票小程序,小程序投票系统刷票
  15. IPFS是创建DWeb应用程序中基础技术的领先者
  16. Rainyday.js – 傻眼了!竟然有如此逼真的雨滴效果
  17. 华为手机安装debug的apk时出现无效安装和与操作系统不兼容问题解决
  18. SQL service基础(二)对数据指定列查询、条件查询、查询结果排序、聚集函数查询、分组统计查询
  19. 随机森林分析共享单车的需求
  20. ubuntu卡在无限循环登录界面,进不去桌面的问题#不重装是我们最后的倔强!#

热门文章

  1. IDEA与tomcat相关配置
  2. out类型参数的讲解
  3. 在大促中什么影响了数据库性能
  4. ActiveMQ专题
  5. 搭建卷积神经网络怎么确定参数_AI入门:卷积神经网络
  6. python知识点汇总百度文库_PYTHON知识点汇总.doc
  7. 搜索专题:bfs和dfs
  8. exit()函数学习
  9. 逃离裁员:程序员在云时代的生存之道
  10. 软件定义存储的定制化怎么走?