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声明成为指针,该类并非为导出类,避免对外暴露实现
c++以代理的方式来实现接口化编程相关推荐
- 分布领域驱动设计(DDD):领域接口化设计式缓存的选择
- 前言 - 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编 ...
- 领域驱动设计(DDD):领域接口化设计
领域接口化设计 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编程.所以我们 ...
- 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)
场景 若依官网: http://doc.ruoyi.vip/ 前提: 服务器上安装Mysql,并将数据库导入,在SpringBoot中的application-druid.yml配置mysql数据库连 ...
- MyBatis运行原理(三)接口式编程及创建代理对象原理分析
一.面向接口开发步骤 定义代理接口,将操作数据库的方法定义在代理接口中. 在SQL 映射文件中编写SQL 语句. 将SQL 映射文件注册在MyBatis 的全局配置文件中. 编写测试代码. 二.环境准 ...
- 在C#中使用代理的方式触发事件 (委托和事件 ) (转)
From: http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...
- php接口调用实例源代码,小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例...
从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读 ...
- java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一 ...
- 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 ...
- HttpClient Get/Post方式调用Http接口
HttpClient Get/Post方式调用Http接口 本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myecli ...
最新文章
- Ubuntu14.04安装JDK
- MacOS 安装monkey教程
- Python入门100题 | 第037题
- 分布式 RPC架构简单理解
- 关于女人强势表现和强势心理
- 浙江省经信委与新华三签署战略合作协议
- 获取SAP Spartacus当前显示产品json数据的又一办法
- ImportError: No module named google.protobuf.internal
- .net解决Xss攻击
- 显示隐藏-visibility(HTML、CSS)
- tcp连接时,BROKEN PIPE错误
- vue组件挂载到全局方法
- mysql 修改密码
- java刷票小程序,小程序投票系统刷票
- IPFS是创建DWeb应用程序中基础技术的领先者
- Rainyday.js – 傻眼了!竟然有如此逼真的雨滴效果
- 华为手机安装debug的apk时出现无效安装和与操作系统不兼容问题解决
- SQL service基础(二)对数据指定列查询、条件查询、查询结果排序、聚集函数查询、分组统计查询
- 随机森林分析共享单车的需求
- ubuntu卡在无限循环登录界面,进不去桌面的问题#不重装是我们最后的倔强!#