定义
![](https://img-blog.csdn.net/20140706174138718)
将一个类的接口与实现分离,使之可以独立的变化。
案例
要定义跨平台的窗口Window,在不同的平台上它有不同的实现AWindow,BWindow等等,根据平台的数目就必须实现特定数目个子类,但是用户在使用的不会关心使用的是什么平台,这时
使用桥接模式可以使之变得简单:
Window类提供接口给用户,而它的实现由WindowImpl提供,可以减少代码的耦合:
class Window {
public:
void drawIcon();
void drawText();
private:
WindowImpl* m_impl;
}
void Window::drawIcon() {
m_impl->drawIcon();
}
void Window::drawText() {
m_impl->drawText();
}
class WindowImpl {
public:
virtual void drawText() = 0;
virtual void drawIcon() = 0;
}
class AWindowImpl : public WindowImpl {
public:
virtual void drawIcon();
virtual void drawText();
}
class BWindowImpl : public WindowImpl {
public:
virtual void drawIcon();
virtual void drawText();
}
桥接模式还可以和抽象工厂模式很好的结合在一起使用来决定使用哪一个Impl:
Window::Window() {
m_impl = WindowFactory::instance()->createImpl();
}
优点
- 分离接口和它的实现,实现改变了与之相关的模块不用再编译
- 提高可扩充性,创建合适的impl
- 实现细节对用户透明,用户只能看到能调用的公用函数
适用性
- 不希望实现与接口有捆绑关系
- 不改变接口的情况下需要扩充,而不引起用户代码的重编译
- 不希望用户了解实现细节
相关模式
可以和抽象工厂模式一起使用。
适配器模式是使两个不相关的类协同工作,通常是系统设计完成后才使用,桥接模式在系统开始的时候就使用,它是使接口和实现相分离。