PIMPL(private implementantion)模式(转载)
前记:请搜索PIMPL(private implementantion)模式和桥接模式, PIMPL是桥接模式的一种典型实现
以下转自:http://blog.csdn.net/nrc_douningbo/article/details/5935218
进行跨平台的移植工作,这其中有些地方是无法完全移植过来的,所以:需要我们封装一个接口类,在不同平台下让其有不同的实现。要做到这一点:有很多办法,条件编译啊之类的。但是如果有这种方法,说白了:其还是两份代码,仅仅是放到同一个文件中。参考Qt实现跨平台的办法,正好读了一片这方面的文章,发现PIMPL模式还是很适用的。
- ----------------------------------------------------------
- //public.h
- Class PrivateClass //前置声明
- Class PublicA:
- {
- Public:
- PublicA(); //如果私有实现类要调用位于公共类中的方法,则将该公共类指针传给私有类构造函数
- ~PublicA();
- Private:
- PrivateClass* iPoint; //含有私有实现类的一个指针
- Private:
- Friend class PrivateClass; //如果私有实现类要调用公开类的方法,则将之声明为友类。
- }
- ----------------------------------------------------------
- //public.cpp
- #include "public.h"
- #ifdef Q_OS_SYMBIAN
- #include "PrivateClass_symbian.h"
- #else
- #include "PrivateClass_win32.h"
- #endif
- PublicA::PublicA()
- {
- #ifdef Q_OS_SYMBIAN iPoint = PrivateClass::NewL(this);
- #else
- iPoint= new PrivateClass(this);
- #endif
- }
- 。。。。。。。
- ----------------------------------------------------------
如上:PIMPL是设计了对外公共类和私有实现类。 亦即:多个平台对外的接口都是唯一的这个对外公共类,而不同平台都有自己的私有实现类 。
为了做到这一点,需要如下做:
1:在头文件中:
①声明一下私有类(不是include)
②含有该私有类的一个指针数据成员。
2:在cpp实现文件中:
①用条件编译的方式决定到底include哪个私有实现类的头文件。
②在对外公共类的函数实现中:也用条件编译的方法决定调用哪一个私有实现类的函数。
为了实现这一点,要求:各个私有实现类的类名必须一样!(文件名可以不一致)
以上是一个最简单的模型,当然:如果私有实现类中想调用对外公共类的函数,则需要在公共类中做两件事:
1:在其创建私有类时:通过参数的方式将自己的指针传入到私有类中,从而让私有类含有公共类的指针。
2:在公共类中将私有类声明为:友元类。 (这样扩大了私有类的访问权限,这个可以依据实际情况来确定需要不需要)
事实上:这正是Qt用来对底层操作系统进行抽象的解决办法,它使开发者无需关心每一个平台的底层编程方法和各种限制。
针对qt开发而言:一般这些私有实现类都是针对不同平台的,比如:symbian的一些系同级的函数,还有一些win特有的函数,这些都是无法做到跨平台的,我们可以用PIMPL模式来进行抽象。此时上边所说的条件编译宏就是:不同平台的宏了。同样:还需要在pro中把针对不同平台的私有实现文件放到平台关键字中。
通常,如果公共类名为QMyClass ,那么:
私有类就被定义为QMyClassPrivate。
公共类的源文件和头文件共享公共类名:qmyclass.h,qmyclass.cpp。
私有类的头文件和源文件名以_p 结尾(比如qmyclass_p.h),除非该文件是一个平台特定实现。
平台特定实现的头文件和源文件名中包括平台名 – 如qmyclass_symbian.cpp (不必在结尾处添加_p ,因为已经暗示)。
PIMPL(private implementantion)模式(转载)的更多相关文章
- Java设计模式系列之动态代理模式(转载)
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...
- Java多线程编程模式实战指南(一):Active Object模式--转载
本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...
- Java多线程编程模式实战指南(三):Two-phase Termination模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...
- Java多线程编程模式实战指南(二):Immutable Object模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...
- Decorator 模式转载
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://tianli.blog.51cto.com/190322/35287 摘要:本文深 ...
- 《JAVA与模式》之解释器模式 (转载)
一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...
- 《JAVA与模式》之原型模式(转载)
原型模式其实就是java的拷贝机制 原文出处:http://blog.csdn.net/zhengzhb/article/details/7393528 定义:用原型实例指定创建对象的种类,并通过 ...
- 《JAVA与模式》之模板模式(转载)
模板方法在servlet中的应用:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 原文出处:http://blo ...
- 浅谈命令查询职责分离(CQRS)模式---转载
在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...
随机推荐
- 简要了解web安全之sql注入
什么是sql注入? 通俗来讲就是通过 将可执行sql语句作为参数 传入查询sql 中,在sql编译过程中 执行了传入进来的恶意 sql,从而 得到 不应该查到或者不应该执行的sql语句,对网站安全,信 ...
- RobHess的SIFT代码解析步骤三
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- 6.Tray Monitor服务(监控服务)
1. Tray Monitor服务(监控服务) 该服务需要运行在gui环境下,用于查看baclua client.存储等状态.下面以windows下安装为例. 1.1. Tray Monito ...
- 六:MVC数据建模(增删改查)
今天我们来学习mvc增删改查等操作(试着结合前面学习的LINQ方法语法结合查询) 我创建了一个car的数据库,只有一个Cars表 表里面就几个字段 插入了一些数据 想要创建一个ADO.NET实体数据模 ...
- vim编辑命令
vi命令 命令模式: yy:复制 光标所在的这一行 4yy:复制 光标所在行开始向下的4行 p: 粘贴 dd:剪切 光标所在的这一行 2dd:剪切 光标所在行 向下 2行 D:从当前的光标开始剪切,一 ...
- 如何正确清理C盘?
Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小.伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足.那么C盘容量不足对 ...
- sql查询数据结果发送到邮箱
#!/bin/bash user=root password=xx dbname=xx DATE=`date +%F` #注意:此处mysql要用全路劲,否则计划任务会执行失败 /mydata/mys ...
- libusb_bulk_transfer 异步同步
同步方式 libusb_bulk_transfer(devh, ep_bulk, buf, CAM_BUF_SZ, &len, timeout); 进入libusb研究,发现libusb是采用 ...
- ISCSI共享存储
ISCSI网络磁盘 默认端口:3260 服务端: 一. 二.安装软件:targetcli 用命令targetcli进行配置------------------------进入iscsi磁盘配置模 ...
- React组件间通信-sub/pub机制
React生命周期第二个demo演示了兄弟组件的通信,需要通过父组件,比较麻烦:下面介绍sub/pub机制来事项组件间通信. 1.导包 npm i pubsub-js 2.UserSearch.jsx ...