首页 > Chrome源码学习, 设计模式 > 设计模式之桥接模式 Boost::scoped_ptr

设计模式之桥接模式 Boost::scoped_ptr

打算把Chrome浏览器源码阅读的一些笔记写到博客上来,Chrome是个大工程,源码下载下来光压缩包就有2G多,解压之后6G多,过段时间我会写一篇如何编译Chrome浏览器的文章。最近阅读了src\base下部分基础组件的代码,感觉学到了很多东西。本文作为第一篇,可能看起来和Chrome没什么关系,不过这个知识点会在实际的开发中经常用到。

你可能没有系统学过设计模式,不懂桥接模式是什么玩意,没关系,你应该见过Impl;你也可能没接触过Boost,不懂scoped_ptr是什么,没关系,你应该见过auto_ptr

一、桥接模式
桥接模式用于将抽象部分与实现部分分离,使得他们可以独立的变化,英文别名为Handle/Body。桥接模式通常在以下(包括但不限于)场合中使用:
1. 类的抽象以及它的实现都可以通过生成子类的方法加以扩充;
2. 对客户隐藏具体的实现部分;
3. 加快工程编译速度,不用因为实现部分的修改而导致大量源文件的重新编译;

《设计模式:可复用面向对象软件的基础》一书中桥接模式的类图如下图所示:
设计模式之桥接模式类图

二、scoped_ptr
再继续讲桥接模式之前,先介绍scoped_ptr。scoped_ptr是Boost中的一个智能指针,该指针以RAII(Resource Acquisition Is Initialization,资源获取即初始化,是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。)机制实现,不支持复制(noncopyable),不支持指针所有权的共享。

你只要知道scoped_ptr是一个智能指针就行了,想用Boost?请猛戳Boost编译和配置。scoped_ptr在本文中就是用于指针的管理。

Boost的scoped_ptr不支持数组,如需要使用数组要用scoped_array,而Chrome源码中自己扩充了scoped_ptr的功能,直接支持数组操作,具体以后会写出来。

三、桥接模式例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <boost/scoped_ptr.hpp>
//#include <boost/scoped_array.hpp>
 
class WindowImp
{
public:
    WindowImp(std::string strWndTitle) :
        m_strWndTitle(strWndTitle) {}
    ~WindowImp()
    {
        std::cout << "~WindowImp()" << std::endl;
    }
    void Draw()
    {
        std::cout << "Draw Window --> " << m_strWndTitle << std::endl;
    }
private:
    std::string m_strWndTitle;
};
 
class Window
{
public:
    Window(std::string strWndTitle)
    {
        m_pImpl.reset(new WindowImp(strWndTitle));
    }
    void Draw()
    {
        m_pImpl->Draw();
    }
private:
    boost::scoped_ptr<WindowImp> m_pImpl;
};
 
int main(int argc, char **argv)
{
    Window wnd("Hello, World.");
    wnd.Draw();
 
    return 0;
}

实际使用时,Window类的定义、WindowImp的定义都应该是一个独立的编译单元(比如一个.h和.cpp对应一个类)。本例中scoped_ptr用于管理WindowImp类型的指针,reset函数重置scoped_ptr所管理的指针。

Window是接口类,WindowImp是实现类。客户可以完全不知道WindowImp的存在,直接调用Window的接口。如果你忽然要把Draw以另一种方式实现,那么你去改动WindowImp::Draw就行了,而不必改动Window::Draw,这样客户调用Window的文件都不需要重新编译,节省了编译时间。

相应的类图如下:
设计模式之桥接模式类图
例子比较简单,所以省去了继承,自然不如第一张类图所描述的灵活。

欢迎关注《Chrome源码学习》系列文章
如果你喜爱我的文章,请点击文章末尾的分享按钮,选择分享各类社交网站,你的分享是对我最大的支持。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 设计模式之桥接模式 Boost::scoped_ptr
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. kedebug
    2013年5月3日19:41 | #1

    赞技术,科神博客已订阅

    [回复]

    代码疯子 回复:

    @kedebug, [em022] 你的我也订了,就是没有看 哈哈 话说最近各种琐事

    [回复]

    kedebug 回复:

    @代码疯子, 我博客里面释放的无用信息太多了,订阅需谨慎,哈哈。同琐事特别多,干啥啥酱油,最近琢磨着以后投奔北京大互联网公司呢,到时候科神求笼罩啊。

    [回复]

  1. 2013年5月8日22:32 | #1