桥接模式(Bridge Pattern)
一、概念
(一)组合、聚合
- 聚合:就是说各个对象聚合在一起工作,但是我没有你也行,我照样可以正常运行。
- 组合呢,关系就比较密切,组合中的各个对象之间组成了一个整体,缺少了某一个对象就不能正常运行或者说功能会有很大缺陷。
- 也就是说
聚合对象 "不具备相同生命周期",而组合对象 "具有相同的生命周期"
(二)桥接模式
桥接模式(Bridge Pattern)也叫做桥梁模式, 使用组合
代替继承建立类之间的关系,将抽象和具体实现解耦,使得两者可以独立地变化。
- 是一个非常简单的模式,它只是使用了
类间的聚合关系、继承、重写
等常用功能,但是它却提供了一个非常清晰、稳定的架构。 -
桥接模式也是通过组合来实现的。解耦的实质—就是 减少对象之间的关联,而继承是一种 "强关联",一旦通过继承,子类就会拥有父类所有公开的方法和属性,有些可能并不是子类需要的,而 “组合” 就不一样,组合是一种 "弱关联",只是持有一个对象且持有对象所拥有的功能并不是我的,和我并没有很强烈的关系。所以实质上在很多场景我们都可以通过组合来解耦继承对象之间的强关联关系。
- 编程原则:
多用组合,少用继承
。
- 编程原则:
二、桥接模式适用场景
当一个类内部具有2种及以上维度变化时
,使用桥接模式可以解耦这些维度,使得高层代码结构稳定,桥接模式一般适用于以下场景:
- 接口或者抽象类不稳定的场景
一个类存在2个或者2个以上独立变化的维度(如下面的)
,而这些维度又需要独立进行扩展时。- 如以电脑为例子,有2个变化的维度:电脑类型(台式机、笔记本、 平板电脑)、电脑品牌(联想、神舟、戴尔、华硕)
不希望使用继承
,或因为多层继承导致类的个数剧增时可以考虑使用桥接模式- PS:桥接模式的其中一个目的就是为了替换继承
三、桥接模式角色
Implementor(抽象实现角色): 它是接口或者抽象类
,定义角色必需的行为(方法)和属性。
- 定义角色需要实现的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。
ConcreteImplementor(具体实现角色):是Implementor的具体实现
,通过实现Implementor
定义的方法和属性。不同的ConcreteImplementor
中可以提供的不同实现。
Abstraction(抽象角色): 一般为抽象类。该类持有一个个Implementor(实现角色)类型的对象,并通过构造方法传入一个ConcreteImplementor,它与Implementor之间具有关联(组合)关系,它既可以定义抽象业务方法,也可以定义自己的具体业务方法。
RefinedAbstractio(拓展抽象角色) : 继承Abstraction
,并通过构造方法
传入一个ConcreteImplementor引用
,通过重写Abstraction
方法,以及调用ConcreteImplementor
的具体业务方法来实现拓展
四、代码例子
Abstraction 是 抽象笔记本电脑,RedefineAbstraction 是 不同品牌的笔记本电脑,Implementor 是 抽象操作系统,ConcreteImplementor 是 具体的操作系统
买 不同电脑品牌 和 安装 不同操作系统
Implementor(抽象实现角色):OS
ConcreteImplementor(具体实现角色):Linux 和 Windows 和 MacOS
Abstraction(抽象角色): Computer
RefinedAbstractio(拓展抽象角色) : DellComputer 和 AppleComputer
五、UML图
六、优缺点
(一)优点
- 桥接模式可以
取代多层继承
的方案。也可以极大的减少子类的个数,从而降低维护和管理类的成本。- 多层继承违背了单一职责原则,复用性较差,类的个数也非常多。
- 在2个变化维度中任意扩展一个维度,只需要
新增类
,无需修改代码,提高了拓展性,符合开闭原则
。 - 通过
组合
而不是继承来实现耦合,符合合成复用原则
。
(二)缺点
- 增加了系统的理解难度和设计难度(这也算是
大部分设计模式的共性
) - 需要正确识别系统中各个独立变化的维度
七、桥接和装饰、适配器模式的不同
- 装饰者模式:主要是为了
不改变原类的情况下,对原类附加新的功能
- 适配器模式:主要是为了
兼容转换客户类对目标类的调用,使客户类能够按自己期望的方式调用目标类
(目标类通常无法直接修改成客户类期望的样子) - 桥接模式:主要是将一个
有着多个维度的类进行拆分,以降低复杂度
,以满足各维度能够独立扩展和维护,然后通过聚合的方式使用这些维度的功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了