pimp技法浅析--实现轻量级的面向接口编程
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技法浅析--实现轻量级的面向接口编程的更多相关文章
- Java中的面向接口编程
面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- java接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...
- java面向接口编程
在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
- java ssm框架入门(一)面向接口编程
因为工作上用到spring + strtus2 + mybatis ,所以开始学习下这个框架. 这里用到的是MySQL数据库 首先从web.xml 开始 <?xml version=" ...
- spring面向接口编程
(1)创建一个接口 package com.min.dao; public interface UserDao { public void save(String uname, String pwd) ...
随机推荐
- ABC361-D题解
背景 保佑LC能来一中. 题意 给你一个长度为 \(n\) 的初始字符串和目标字符串,都由 W 和 B 两种字符构成. 现在初始字符串末尾接有两个空格字符,每次你可以在该字符串中选出连续两个非空格字符 ...
- odoo 通过Javascript显示或隐藏form自带按钮
实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示.隐藏进行控制 代码实现 隐藏.显示编辑和创建按钮为例 od ...
- Java 线程池之ThreadPoolExecutor学习总结
前提 java version "1.8.0_25" 池简述 软件开发活动中,我们经常会听到数据库连接池.内存池.线程池等各种"池"概念,这些"池&q ...
- MySQL 纵表转横表查询实现
纵表转横表查询实现 By:授客 QQ:1033553122 欢迎加入全国软件测试交流群:7156436 实践环境 MySQL 5.7 创建测试表 CREATE TABLE tb_test ( id I ...
- 题解:P10608 双人游戏
题解:P10608 双人游戏 题意 给予你一个长度为 \(n\) 的字符串 \(c\),\(c\) 上有三种颜色的棋子,其中有 \(m\) 个空字符. 接下来有 \(m\) 个操作,每个操作意味小 M ...
- python multipart/form-data post接口请求
python multipart/form-data post接口请求 def WebKit_format(data, boundary="----WebKitFormBoundary*** ...
- 【Vue】NPM构建的一些问题解决
9418端口已经不再支持未授权的GIT协议 C:\Users\Administrator\Desktop\wss-taskcore-web>npm install npm ERR! Error ...
- 【MySQL】01 概念与介绍
视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax 用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...
- Java 文件 I/O流详解
文件 文件操作是Java开发中一个重要的组成部分,它允许开发者对文件进行读取,写入,创建,删除和修改等操作,文件操作的主要通过java.io包中的类来实现的,其中的File类更是文件操作的核心类 Fi ...
- 【摘录】人形机器人和自动驾驶技术 —— 3D机器视觉技术
以下内容引自: https://www.eda365.com/forum.php?mod=viewthread&tid=744288 3D机器视觉技术分为两个部分,即3D重构技术和3D数据分析 ...