Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1741520
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-25 19:32:03

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


  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都是抽象类,作为基类,将来两个类层次会独立扩展而互不影响。

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