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

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. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  2. AOP:代理实现方式①通过继承②通过接口

    文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...

  3. cglib动态代理是通过继承父类的方式进行代理的 不是通过接口方式进行动态代理的 因此可以对普通的类进行代理

    cglib动态代理是通过继承父类的方式进行代理的 不是通过接口方式进行动态代理的

  4. AOP:静态代理实现方式①通过继承②通过接口

    文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...

  5. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  6. 12Mybatis_用mapper代理的方式去开发以及总结mapper开发的一些问题

    上一篇文章总结了一些Dao开发的问题,所以我们这里开始讲一种mapper代理的方式去开发. 我先给出mapper代理开发的思路(mapper代理开发的规范): 我们用mapper代理开发时要写2个: ...

  7. Cglib动态代理实现方式

    Cglib动态代理实现方式 我们先通过一个demo看一下Cglib是如何实现动态代理的. 首先定义个服务类,有两个方法并且其中一个方法用final来修饰. public class PersonSer ...

  8. Java中的静态代理实现方式

    1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...

  9. Java动态代理实现方式一

    Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Ja ...

随机推荐

  1. vim使用案例

    1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录: 2. 进入 vitest 这个目录当中: 3. 将 /etc/man.config 复制到本目录底下(或由上述的连结下载 man. ...

  2. Go语言规格说明书 之 Go语句(Go statements)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  3. ThinkPHP 3.1.3及之前的版本使用不当可造成SQLi

    Lib/Core/Model.class.php中解析SQL语句的函数parseSql没有对SQL语句进行过滤,使用不当可导致SQL注入.(哈哈,其实用再安全的框架使用不当都可能造成SQLi) 函数: ...

  4. JDK1.5引入的concurrent包

    并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术.但是多线程又存在资源竞争的问题,引发了同步和互斥,并带来线程安全的问题.于是,从jdk1.5开始,引入了concurren ...

  5. mpVue小程序全栈开发

    1.微信小程序,mpVue和wepy的对比 2. 3.es6中关于数组的一些方法 <script> let arr = [,,,] // 遍历 arr.forEach(v => { ...

  6. 从LeNet-5到DenseNet

    一篇不错的总结:https://zhuanlan.zhihu.com/p/31006686

  7. PHP接口继承及接口多继承原理与实现方法详解

    在PHP的接口中,接口可以继承接口.虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口.当然接口的继承也是使用extends关键字,要多个继承的话只 ...

  8. web----粘包

    一.什么是粘包 所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的. 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在 ...

  9. Navicat for Oracle 绿色版 连接 Oracle 12c

    亲测可用,留下文章以备忘记. Navicat for Oracle 绿色版 地址 链接:http://pan.baidu.com/s/1qY5wMok 密码:kw06 解压到一个目录下. 然后还需要O ...

  10. 《剑指offer》-中序遍历下一个节点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { in ...