前记:请搜索PIMPL(private implementantion)模式和桥接模式, PIMPL是桥接模式的一种典型实现

以下转自:http://blog.csdn.net/nrc_douningbo/article/details/5935218

进行跨平台的移植工作,这其中有些地方是无法完全移植过来的,所以:需要我们封装一个接口类,在不同平台下让其有不同的实现。要做到这一点:有很多办法,条件编译啊之类的。但是如果有这种方法,说白了:其还是两份代码,仅仅是放到同一个文件中。参考Qt实现跨平台的办法,正好读了一片这方面的文章,发现PIMPL模式还是很适用的。

  1. ----------------------------------------------------------
  2. //public.h
  3. Class PrivateClass //前置声明
  4. Class PublicA:
  5. {
  6. Public:
  7. PublicA(); //如果私有实现类要调用位于公共类中的方法,则将该公共类指针传给私有类构造函数
  8. ~PublicA();
  9. Private:
  10. PrivateClass* iPoint;  //含有私有实现类的一个指针
  11. Private:
  12. Friend class  PrivateClass; //如果私有实现类要调用公开类的方法,则将之声明为友类。
  13. }
  14. ----------------------------------------------------------
  15. //public.cpp
  16. #include "public.h"
  17. #ifdef Q_OS_SYMBIAN
  18. #include "PrivateClass_symbian.h"
  19. #else
  20. #include "PrivateClass_win32.h"
  21. #endif
  22. PublicA::PublicA()
  23. {
  24. #ifdef Q_OS_SYMBIAN                iPoint = PrivateClass::NewL(this);
  25. #else
  26. iPoint= new PrivateClass(this);
  27. #endif
  28. }
  29. 。。。。。。。
  30. ----------------------------------------------------------

如上: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)模式(转载)的更多相关文章

  1. Java设计模式系列之动态代理模式(转载)

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...

  2. Java多线程编程模式实战指南(一):Active Object模式--转载

    本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...

  3. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...

  4. Java多线程编程模式实战指南(二):Immutable Object模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...

  5. Decorator 模式转载

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://tianli.blog.51cto.com/190322/35287 摘要:本文深 ...

  6. 《JAVA与模式》之解释器模式 (转载)

    一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...

  7. 《JAVA与模式》之原型模式(转载)

    原型模式其实就是java的拷贝机制 原文出处:http://blog.csdn.net/zhengzhb/article/details/7393528   定义:用原型实例指定创建对象的种类,并通过 ...

  8. 《JAVA与模式》之模板模式(转载)

    模板方法在servlet中的应用:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 原文出处:http://blo ...

  9. 浅谈命令查询职责分离(CQRS)模式---转载

    在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...

随机推荐

  1. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 问题解决

    有两种设置方法 第一种在mysql的配置文件中加入,然后重启mysql innodb_lock_wait_timeout = 500 第二种直接执行如下命令 set global innodb_loc ...

  2. 11.SSH整合

    由于自己学习的版本比较落后,这里就不总结了 在我这个版本整合的过程中的几点问题: 1.在web.xml的配置过程中: <!-- 如果使用的是load获取数据,在jsp页面申请取得数据时才真正的执 ...

  3. MySQL8.0 caching_sha2_password报错问题

    在bin目录下执行mysql -uroot -p123456 登录后执行: use mysql; select host, user, plugin from user; 打印: +--------- ...

  4. Django—model系统:ORM之其他骚操作

    Django ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, ...

  5. linux常用的操作命令

    ---恢复内容开始--- 最近换了工作之后,需要管理linux服务器的日常运行和维护,自然linux命令是少不了的,切换目录,vim操作等的简单的操作就不说了,有些时候还需要查看日志和监控服务器启动进 ...

  6. python 判断数据类型及释疑

    Python 判断数据类型有type和isinstance 基本区别在于: type():不会认为子类是父类 isinstance():会认为子类是父类类型 class Color(object): ...

  7. python_连接MySQL数据库(未完)

    1.增 # 导入库 import pymysql # 创建连接 conn = pymysql.connect(host='localhost',user='root',password='fuqian ...

  8. Java 正则表达式获取两个字符中间的内容

    利用 正则表达式 获取两个字符串中间的值 直接上代码吧,不是很难. public static void main(String[] args) { // 内容 String value = &quo ...

  9. bzoj1458: 士兵占领(最大流)

    题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...

  10. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...