pimp.hpp:

#ifndef pimp_hpp
#define pimp_hpp class CMyComponent{
public:
CMyComponent();
~CMyComponent(); void DoSomething(); private:
class CMyComponentImpl;
CMyComponentImpl* m_impl;
}; #endif

pimp.cpp:

#include <iostream>
#include <pimp.hpp> using namespace std; class CMyComponent::CMyComponentImpl{
public:
CMyComponentImpl(){ }
~CMyComponentImpl(){ } void DoSomething(){ cout << "do something" << endl;
}
}; CMyComponent::CMyComponent():m_impl(new CMyComponentImpl){ } CMyComponent::~CMyComponent(){
delete m_impl;
} void CMyComponent::DoSomething(){
m_impl->DoSomething();
} int main(){ CMyComponent obj;
obj.DoSomething(); return 0;
}

编译运行:

root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# g++ pimp.cpp -I. -o ab
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp#
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp#
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# ./ab
do something
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp#

在以上示例代码中,

我们定义了组件类CMyComponent,同时定义了私有嵌套类CMyComponentImpl,

我们的对外接口DoSomething的实现代码被转发到了内部类CMyComponentImpl,

这样做的实现的效果是:

客户仅需要面向CMyComponent,而CMyComponent的实现被隔离到内部CMyComponentImpl类中。

只要保持CMyComponent类的公共接口不变,则客户代码不需要重新编译!

例如,我们在内部实现中添加一个数据成员,此时虽然内部类的对象尺寸发生了变化,但是我们的客户却不需要重新编译。

这种隔离措施,使我们的组件开发者可以随意改变组件的内部实现代码而不会影响到客户,这也是面向接口编程的精髓之处。

结论:

1) 善用pimp技法,可以实现接口与实现隔离,防止客户代码的不必要重新编译。

2) pimp内部通过转发实现,有一定的运行时性能损失,但我们得到的却是代码的封装和可维护性。

3) 尽量在组件接口中避免声明数据成员,仅定义对外方法,给予组件实现者最大限度的更改自由。

.

pimp技法浅析--实现轻量级的面向接口编程的更多相关文章

  1. Java中的面向接口编程

    面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...

  2. javascript设计模式学习之十七——程序设计原则与面向接口编程

    一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...

  3. Java面向接口编程,低耦合高内聚的设计哲学

    接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...

  4. java接口,接口的特性,接口实现多态,面向接口编程

    package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...

  5. java面向接口编程

    在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...

  6. go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?

    到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...

  7. Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

  8. 【GoLang】golang 面向对象编程 & 面向接口编程

    005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...

  9. java ssm框架入门(一)面向接口编程

    因为工作上用到spring + strtus2 + mybatis ,所以开始学习下这个框架. 这里用到的是MySQL数据库 首先从web.xml 开始 <?xml version=" ...

  10. spring面向接口编程

    (1)创建一个接口 package com.min.dao; public interface UserDao { public void save(String uname, String pwd) ...

随机推荐

  1. [oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理

    ​ 放入路径 回忆上次内容 上次总算可以把 sleep.py 直接执行了 sleep.py文件头部要声明好打开方式 #!/usr/bin/python3 用的是 python3 解释 sleep.py ...

  2. vscode 调试 nodejs 程序

    nodejs 服务在vscode 中的调试 1.安装vscode 略(这不用说了吧) 2.写一个能跑的nodejs 程序 其实看到这个,自己已经有一个能跑的nodejs 程序,不用看我的了 我这里是我 ...

  3. 【教程】运行所选代码生成器时出错:“无法解析依赖项。"EntityFramework 6.4.4" 与 ' EntityFramework.zh-Hans 6.2.0 约束:EntityFramework(=6.2.0)'不兼容。"

    添加包含视图的控制器 执行以上添加"包含视图的MVC5控制器(使用Entity Framework)时报错 解决方案 在解决方案资源管理器中找到packages.config 注释掉Enti ...

  4. mysql索引失效的情况七字口诀:“模型数空运最快”

    mysql索引失效的情况 七字口诀:"模型数空运最快" 模:使用like进行模糊查询的时候,以百分号%开头的,索引就会失效. 型:代表数据类型,数据类型错误了,索引也会失效. 数: ...

  5. SLF4J2.0.x与Logback1.3.x的绑定变动还是很大的,不要乱点鸳鸯谱

    开心一刻 今天跟我姐聊天 我:我喜欢上了我们公司的一个女同事,她好漂亮,我心动了,怎么办 姐:喜欢一个女孩子不能只看她的外表 我:我知道,还要看她的内在嘛 姐:你想多了,还要看看自己的外表 背景介绍 ...

  6. web3 产品介绍 etherscan 区块链浏览器 将抽象的数据和理论可视化,小白也能看懂区块链

    Etherscan是一个广泛使用的以太坊区块链浏览器和分析平台,它为用户提供了全面的区块链数据查询和交易分析功能.在本文中,我们将介绍Etherscan的主要特点和功能,以及如何使用它来浏览以太坊区块 ...

  7. 【Java】Applet开发

    一.Applet开发环境准备 IDEA在2018版本默认提供了Applet启动配置 创建一个Applet应用配置: 在IDEA2019版本之后,这个应用配置选项被移除了,改为Java Applet S ...

  8. 【Java】JNDI实现

    前提情要: 培训的时候都没讲过,也是书上看到过这么个东西,进公司干外包的第二个项目就用了这个鬼东西 自学也不是没尝试过实现,结果各种失败,还找不到问题所在,索性不写了 JNDI实现参考: 目前参考这篇 ...

  9. 【SpringMVC】02 流程分析

    首先是web.xml配置SpringMVC最核心的东西,DispatcherServlet 也称为[请求分发器][前端控制器][分发Servlet] <!--1.注册DispatcherServ ...

  10. 【MySQL】30 备份与恢复

    1.备份命令: mysqldump -u用户名 -p 密码 -h 服务主机IP -P 端口号 \ 数据库名称 \ > 指定备份的sql脚本文件位置 ↓ # 文件位置样例: # C:\Users\ ...