设计模式之桥接模式

桥接模式(Bridge)

定义

Decouple an abstraction from its implementation so that the two can vary independently
(将抽象与实现解耦,使得两者可以独立变化)

说明

桥接模式又名桥梁模式、柄体(handleandbody)模式、接口模式,是一种相对简单的设计模式。它的作用是将抽象部分与实现部分分离,使二者可以独立变化。主要优势是类内解耦,实现方法是将继承改成组合。继承的最大劣势是类的侵入性,而组合正好解决了这个问题。
一般情况下抽象类与实现类之间通过继承关系关联,两者之间是一个紧耦合的关系。抽象类的接口改变一定会影响到一系列子类的变更,这种变更是无法控制的。尤其是在多层嵌套继承的情况下,高阶接口的改变会导致底层接口的功能发生变更,如果变更发生在一个复杂庞大的系统中,这种改变大概率会发生连锁反应,对于系统整体功能是致命的。
为了解决这个问题,就要削弱类间关系的紧密度,将耦合度高的关系降级为耦合度低的关系,图中展示了类间关系的强弱。

请添加图片描述
实现

实现是指一个具体类实现了抽象接口的方法;实现是指类与接口之间的关系。
设计模式之桥接模式_第1张图片

泛化

泛化又名继承,是子类(类或接口)继承父类(类、抽象类或接口)的过程。通过继承子类可以从父类那里得到新的功能和能力,继承是类与类,接口与接口之间最常见的关系,它与实现关系同样都是强关系类型,并且它们的力度相同。设计模式之桥接模式_第2张图片

关联

关联关系体现了接口,类与抽象类三者之间的一种强依赖关系。这种关系比依赖关系更强,不存在依赖的偶然性,也不是临时的而是长期的并且一定存在着某种关系。关联关系一旦建立就不会中断,比如张三和李四是一对好朋友,二者之间的朋友关系一旦确立就不会中断,即使二人反目也无法改变二人曾经是朋友这个事实。关联关系的双方一般是平等的,能够单项也能双向,能一对一也能多对多。
请添加图片描述

聚合

聚合是关联关系中的一种特例,它的耦合度要比关联强一些。主要体现整体与部分的关系,也叫has-a关系,整体拥有或包含某一个部分,这种关系中的角色可以相互独立的,部分可以脱离整体,整体也可以不再拥有某一部分。整体和部分二者分别拥有各自的生命周期,可以独立变化。好比公司和员工的关系,员工可以脱离公司,公司也可以不再聘用某个员工,公司和员工可以独立发展。只要员工还在该公司里就可以认为二者是一种聚合关系。
请添加图片描述

组合

组合关系的耦合强度仅次于实现和泛化,这种关系比聚合更强,也称为强聚合关系,是关联关系的另一特例。组合关系也叫contains-a的关系,即整体包含某一部分,并且整体与部分之间不可再分,部分影响着整体而整体决定着部分。如果整体的生命周期结束,那么部分的生病也会结束,如果部分发生改变,会对整体产生极大影响。比如人和大脑。
请添加图片描述

依赖

依赖关系是类关系中最弱的关系,假如A依赖于B,那么A依赖于B的这个过程可能是偶然发生的,也许永远都不会发生,也许只是在将来的某个时间段会发生。
这种关系很脆弱,很容易被打破,但是这种关系一点存在那么B的变化就会影响到A。比如张三与公交车的关系,只有张三要乘坐的时候二者才会发生关系(张三依赖于公交车出行),这个关系是偶然的,并且非常脆弱(张三可能不坐公交车改坐出租车),一点关系建立公交车的改变将会影响到张三(比如公交车翻车了)。
请添加图片描述

桥接模式类图:
设计模式之桥接模式_第3张图片

类图中Abstract的抽象实现类与Implementor接口的具体实现类可以独立变化,从而达到抽象与实现相分离的效果。图中的聚合关系将抽象部分与实现部分连接起来,如同一座桥梁联系着两个部分(这可能就是桥接这个名字的由来 =•ω•=))。

结构

桥接模式中的角色:
Abstractor 抽象化角色:它的主要职责是定义该角色的行为,对实现化角色进行指定,一般是抽象类
RefindAbstractor 扩充抽象化角色:用实现化角色对抽象化角色的功能进行修正或扩充
Implementor 实现化角色:接口或抽象类,定义实现类必须实现的行为
ConcreteImplementor 具体实现化角色:具体要实现的行为,标准由实现化抽象接口规范

桥接模式中实现原只是抽象行为的一部分,抽象角色引用实现角色完成完整的功能,也可以说抽象行为的一部分实现是由实现角色完成的,这里也呼应了聚合关系。
要想理解桥接模式首先要知道这座“桥”是干什么的,桥的两端连接了什么,如果没有这座桥将会怎样。
从类图中已经看到桥接模式的两端是抽象实现与具体实现,这座桥连接了抽象与具体,如果把抽象与具体融合到一块,就相当于把所有的动作看作一个整体,既然是整体就会导致无法修改其中的部分行为,最终导致难以变更,不符合OCP原则。

桥接模式的优势

1、桥接模式将原本一个维度的变化过程拆分成两个,并且两个维度(抽象、实现)可以在规定的接口范围内独立变化。
2、分离了抽象与实现,用关联的方式实现系统行为,比继承的耦合度更低,因为没有了继承实现将不再受抽象的约束,不再被强制绑定在一个固定的抽象层次上。
3、对新增开放,新功能的扩充将变得更容易,并且新功能不会影响原有功能。
4、细节透明,开发者不必关系具体的实现细节,因为具体实现已经由抽象层根据聚合关系完成了封装。

桥接模式的使用

桥梁模式的使用场景
● 不希望或不适用使用继承的场景
例如继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。
● 接口或抽象类不稳定的场景
明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失
败的做法。
● 重用性要求较高的场景设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出
现太细的颗粒度

你可能感兴趣的:(设计模式,设计模式,桥接模式)