3.4.6 应用于桥接模式
桥接模式(bridge)是一种结构型设计模式,它把类的具体实现细节对用户隐藏起来,以达到类之间的最小耦合关系。在具体编程(www.cppentry.com)实践中桥接模式也被称为pimpl或者handle/body惯用法,它可以将头文件的依赖关系降到最小,减少编译时间,而且可以不使用虚函数实现多态。
scoped_ptr和shared_ptr都可以用来实现桥接模式,但shared_ptr通常更合适,因为它支持拷贝和赋值,这在很多情况下都是有用的,比如可以配合容器工作。
本书不可能完整讲述桥接模式和pimpl惯用法的所有细节,仅通过一个小例子来说明shared_ptr如何用于pimpl。
首先我们声明一个类sample,它仅向外界暴露了最小的细节,真正的实现在内部类impl,sample用一个shared_ptr来保存它的指针:
- class sample
- {
- private:
- class impl; //不完整的内部类声明
- shared_ptr<impl> p; //shared_ptr成员变量
- public:
- sample(); //构造函数
- void print(); //提供给外界的接口
- };
-
- 在sample的cpp中完整定义impl类和其他功能:
-
- class sample::impl //内部类的实现
- {
- public:
- void print()
- { cout << "impl print" << endl;}
- };
-
- sample::sample():p(new impl){} //构造函数初始化shared_ptr
- void sample::print() //调用pimpl实现print()
- { p->print();}
最后是桥接模式的使用,很简单:
- sample s;
- s.print();
桥接模式非常有用,它可以任意改变具体的实现而外界对此一无所知,也减小了源文件之间的编译依赖,使程序获得了更多的灵活性。而shared_ptr是实现它的最佳工具之一,它解决了指针的共享和引用计数问题。(关于桥接模式更详细的讨论请见推荐书目[1])
9.4.10小节(368页)有另一个真实的pimpl用法例子,但很遗憾它没有用到智能指针。