桥接(Bridge)模式

桥接模式是将抽象部分和它的实现部分分离,使他们都可以独立的变化的对象结构型模式。桥接模式通过将继承改为组合的方式来解决问题;具体来说就是抽取其中一个维度并使之成为独立的类层次。

动机

当一个抽象有多个实现时,通常用继承来协调他们。抽象类定义对该接口的抽象,具体的子类则用不同方式加以实现,但此方式使得继承机制将抽象部分与它的实现部分固定在一起,难以对抽象部分和实现部分独立的进行修改,扩充和重用;

使用场景

  • 不希望在抽象和他的实现部分之间有一个固定的绑定关系,这种情况可能是因为,在程序运行时刻,实现部分应可以被选择或者切换
  • 抽象和实现都可以通过生成子类的方式加以扩充,这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译(对抽象的实现进行修改,不需要桥接模式就可以实现?)
  • 想对客户完全隐藏抽象的实现部分。在C++中类的表示在类接口中是可见的
  • 有许多类要生成,这样的一种类层次结构说明必须将一个对象分解成两部分
  • 想在多个对象间共享实现,但同时要求客户不知道这一点——使用场景
  • 如果想拆分或重组一个具有多重功能的庞杂类,可以使用桥接模式
  • 如果希望在几个独立维度上扩展一个类,可以使用该模式

参与者

  • Abstraction:
    • 定义抽象类接口
    • 维护一个指向Implementor类型对象的指针
  • RefeinedAbstraction:扩充由Abstraction定义的接口
  • Implementor:定义实现类的接口,这些接口不一定要与Abstraction一致,事实上可以完全不同。一般来说Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作
  • ConcreImplementor:实现Implementor接口并定义它的具体实现

优劣

  • 优点
    • 分离接口及其实现部分。一个实现未必不变的绑定在一个接口上,抽象类的实现可以在运行时刻配置,一个对象甚至可以在运行时刻改变他的实现;另外接口和实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分只需要知道Abstraction和Implementor即可。
    • 提高可扩充性。可以独立的对Abstraction和Implementor层次结构进行扩充
    • 隐藏了实现细节:对外提供的class要暴露其API(不管是public,private或protected)和数据成员,桥接模式可以避免对外暴露这些细节,只需要提供对外公共接口即可。同时,头文件可能需要包含各种库,但是将实现放在Implementor中可以避免这些包含,从而也保证了提供一个想对简洁的对外头文件。
    • 修改隐藏的Implementor类的数据成员不会影响二进制兼容。
    • 提高编译时间
  • 缺点

协作

Abstraction将client的请求转发给它的Implementor对象

实现

  • 仅有一个Implementor:在仅有一个实现的时候,没有必要创建一个抽象的Implementor
  • 创建正确的Implementor对象:当存在多个Implementor类的时候,应该用何种方法,在何时何地创建哪个Implementor对象
  • 共享Implementor对象
  • 采用多重继承机制
  • 怎样将正确的Implementor对象传给Abstraction对象?怎样使用抽象工厂来创建和配置一个特定的Bridge模式

相关模式

  • 抽象工厂可以用来创建和配置一个特定的Bridge模式
  • Adapter模式用来帮助无关的类协同工作,他通常在系统设计完成后才会被使用,而Bridge模式在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变

应用和思考

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010378559/article/details/131690571