Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3514557
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类:

2012-12-31 16:24:45

一般而言抽象和实现会在同一个类层次里,就像这样:


  1. interface SomeInterface { virtual void f() = 0; }
  2. class SomeImplementation : public SomeInterface { virtual void f() {} }

这种设计的好处在于用户只和接口 交互,所以实现可以随意改变。但是接口的改变会影响到实现,所以当接口需要经常改变时,就可能需要桥接模式。
  1. class Abstract
  2. {
  3. public:
  4.     virtual void f() = 0;
  5. private:
  6.     Implementor* pImpl;
  7. };

  8. class Implementor
  9. {
  10. public:
  11.     virtual void f_impl() = 0;
  12. };

通过桥接模式,抽象和实现被分隔成两个类层次,抽象和实现可以单独改变而不用影响对方。Abstract可以根据需要派生出子类,并调用Implementor中的方法。
  1. class ConcreteAbstract : public Abstract
  2. {
  3.     void f() { pImpl->f_impl(); }
  4. };

使用桥接模式不只改变你的实现,也改变你的抽象。


PIMPL模式,或称为Private Class Data PatternOpaque Pointer,是一种隐藏类的内部实现细节的一种方式。


  1. class ExposedClass
  2. {
  3. public:
  4.     void f() { pImpl->f(); }
  5. private:
  6.     ImpClass* pImp;
  7. };

  8. class ImpClass
  9. {
  10. public:
  11.     void f() { // do the real thing }
  12. private:
  13.     Data1 d1;
  14.     Data2 d2;
  15. };

客户只能看到公开类的API,却完全看不到类的数据以及内部实现。


桥接模式和PIMPL模式的区别:

Pimpl模式偏重于隐藏细节,而且ExposedClass和ImpClass都是具体类,将来一般不作为基类再扩展。

桥接模式偏重于抽象和实现的独立扩展。Abstract和Implementor都是抽象类,作为基类,将来两个类层次会独立扩展而互不影响。

阅读(1122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~