桥接模式的定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度;
我们知道继承的优点有很多,可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本功能;但是继承有一个致命缺点,那就是强侵入,父类有一个方法,子类也必须有这个方法,这是不可选择的,会带来扩展性的问题。
桥接模式就是这一问题的解决方法,桥梁模式描述了类间弱关联关系,父类完全可以把可能会变化的方法放出去,子类要拥有这个方法就把桥梁搭过去,获得这个方法。所以针对继承存在的问题,我们可以扬长避短:对于比较明确不发生变化的,则通过继承来完成;若不能确定是否会发生变化的,则通过桥梁模式来解决。
注:由于继承具有强侵入性,因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承;
桥接模式的通用类图如下:
桥接模式主要包括以下四种角色:
- 抽象化角色(Abstraction):主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类;
- 实现化角色(Implementor):它是接口或者抽象类,定义角色必需的行为和属性;
- 修正抽象化角色(RefinedAbstraction):它引用实现化角色对抽象化角色进行修正;
- 具体实现化角色(ConcreteImplementor):它实现接口或抽象类定义的方法和属性;
关于这四种角色,大家记住一句话:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的;
3、代码实现桥接模式 的Java代码实现如下:
//实现化角色
public interface Implementor {
//基本方法
public void doSomething();
public void doAnything();
}
//具体实现化角色,代表不同的业务逻辑
public class ConcreteImplementor1 implements Implementor{
public void doSomething(){
//业务逻辑处理
}
public void doAnything(){
//业务逻辑处理
}
}
public class ConcreteImplementor2 implements Implementor{
public void doSomething(){
//业务逻辑处理
}
public void doAnything(){
//业务逻辑处理
}
}
//抽象化角色
public abstract class Abstraction {
//定义对实现化角色的引用
private Implementor imp;
//约束子类必须实现该构造函数
public Abstraction(Implementor _imp){
this.imp = _imp;
}
//自身的行为和属性
public void request(){
this.imp.doSomething();
}
//获得实现化角色
public Implementor getImp(){
return imp;
}
}
//修正抽象化角色
public class RefinedAbstraction extends Abstraction {
//覆写构造函数
public RefinedAbstraction(Implementor _imp){
super(_imp);
}
//修正父类的行为
@Override
public void request(){
super.request();
super.getImp().doAnything();
}
}
//使用举例
public class Client {
public static void main(String[] args) {
//定义一个实现化角色
Implementor imp = new ConcreteImplementor1();
//定义一个抽象化角色
Abstraction abs = new RefinedAbstraction(imp);
//执行
abs.request();
}
}
4、特点
优点:
1、抽象与实现分离,扩展能力强;
这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式;在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上;
2、符合开闭原则;
3、符合合成复用原则;
4、实现细节对客户透明;
使用者不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装;
缺点:
1、增加了设计的复杂度;
由于聚合关系建立在抽象层,要求开发者对抽象层进行设计,能正确地识别出系统中独立变化的维度,这增加了一定的设计难度;
5、适用场景
桥接模式通常适用于以下场景:
1、不适用使用继承的场景
例如,继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。
2、接口或抽象类不稳定的场景
3、重用性要求较高的场景
设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度;
我的视频课
下面是我录制的一些视频课,欢迎大家围观~
《设计模式修炼真经》
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
本套课程深入介绍了经典的23种设计模式,并加入了自己的感悟,希望大家能够彻底掌握设计模式,写出最好的代码,达到无招胜有招的境界,最终超越这23种设计模式。
《彻底搞定JVM》
JVM是Java中重要的也是较难理解的内容;
面试者对JVM的了解程度某种程度上反映了面试者技术深度,所以JVM也是面试时经常考察的内容;
本课程从JVM运行流程、数据运行时区域组成部分、类加载机制、垃圾回收机制、内存模型、常见面试题讲解等角度出发,帮你彻底搞定JVM,拿下心仪Offer;
《Android性能优化参考》
本课程包含了Android中的App启动优化、UI优化、内存优化、图片优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。
性能优化作为Android高级开发的必备技能,也是大厂面试必考的题目,是体现一个人技术深度最好的试金石。
《面试之排序算法》
排序算法是我们面试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插入排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和二路并归排序。每种算法都详细介绍了核心思想、详细步骤、时间复杂度和代码实现,希望帮助大家深入理解排序算法,搞定面试!
《Android HyBrid App开发实战》
本课程为Android HyBrid App开发实战课程,由浅入深,从三种App的历史和特点开始,介绍了Android WebView的使用、Java和JS交互的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最后通过一个网上商城的实战综合全部内容,让同学们掌握并深入理解Android HyBrid App开发。
《AI导论》
介绍人工智能AI的诞生历史和到现在为止的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经网络结构搜索 NAS、生成对抗网络 GAN等;最后对AI发展做出展望。
本课程属于导论课程,旨在帮助同学们从宏观层面把握AI,建立AI的知识体系。
《Java注解精讲》
本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使用和自定义,注解的源码和架构分析;
本课程语言简单凝练,视频短小精悍,让你一次彻底搞懂Java注解!
《Java反射精讲》
反射是Java中重要的也是较难理解的内容;
本课程从反射的定义、作用、原理和使用出发,全方位帮你彻底搞定反射;
您的点赞是我前进的动力~
给作者买瓶咖啡提提神~



