一、桥接模式
桥接模式用于将抽象部分与实现部分分离,使得他们可以独立的变化,英文别名为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 | |
实际使用时,Window类的定义、WindowImp的定义都应该是一个独立的编译单元(比如一个.h和.cpp对应一个类)。本例中scoped_ptr用于管理WindowImp类型的指针,reset函数重置scoped_ptr所管理的指针。
Window是接口类,WindowImp是实现类。客户可以完全不知道WindowImp的存在,直接调用Window的接口。如果你忽然要把Draw以另一种方式实现,那么你去改动WindowImp::Draw就行了,而不必改动Window::Draw,这样客户调用Window的文件都不需要重新编译,节省了编译时间。