介绍
**定义:**将抽象部分与实现部分分离, 使它们都可以独立变化. 用于处理多继承存在的问题, 用抽象关联来取代传统的多层继承, 将类之间的静态继承关系转变为动态的组合关系, 使系统更加灵活且更易于拓展. 有效控制了系统中类的个数, 避免了继承层次的指数级爆炸.
为了方便理解, 在这里举个例子:
假设自己要在网上卖衣服, 衣服的颜色有红/黄/蓝/绿四种, 每种颜色的衣服又有S/M/L/XL四种尺码, 如果按照常规的继承结构设计的话, 从顶层的衣服类开始向下继承: 每种颜色+尺码的组合都将会是一个单独的类. 简单计算, 此时总共需要4 * 4 = 16个类(红S, 红M, 红L, 红XL, 绿S....), 如果颜色和尺码都分别增加一个呢(5 * 5 = 25)? 只是多增加了一个尺码和一种颜色就瞬间多出了9个类, 而随着颜色和尺码的不断增加, 子类的个数将会呈现出指数级的增长.
UML

示例
java
package com.sumlv.demo;
import com.sumlv.demo.bridge.Clothes;
import com.sumlv.demo.bridge.SmallSizeClothes;
import com.sumlv.demo.service.impl.RedColor;
public class Main {
public static void main(String[] args) {
Clothes clothes = new SmallSizeClothes(new RedColor());
clothes.wearing();
}
}
java
package com.sumlv.demo.bridge;
/**
* 衣服类(抽象化角色)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-07
*/
public abstract class Clothes {
protected Color color;
public Clothes(Color color) {
this.color = color;
}
public abstract void wearing();
}
java
package com.sumlv.demo.bridge;
/**
* 小号衣服(拓展抽象化角色)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-07
*/
public class SmallSizeClothes extends Clothes {
private static final String SIZE = "小号";
@Override
public void wearing() {
System.out.println("开始穿衣服");
System.out.println("衣服的颜色为:" + color.getColor());
System.out.println("衣服的尺码为:" + SIZE);
System.out.println("衣服穿好了");
}
public SmallSizeClothes(Color color) {
super(color);
}
}
java
package com.sumlv.demo.bridge;
/**
* 颜色接口(实现化角色)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-07
*/
public interface Color {
String getColor();
}
java
package com.sumlv.demo.service.impl;
import com.sumlv.demo.bridge.Color;
/**
* 红色(具体实现化角色)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-07
*/
public class RedColor implements Color {
@Override
public String getColor() {
return "红色";
}
}
总结
使用场景
-
统一协议下增加不同组件时, 如: JDBC驱动(连接步骤相同, 数据库间实现不同), 消息驱动(发送流程相同, 通信实现不同);
-
拆分复杂对象时(过于复杂的对象不方便维护和理解, 可以根据实际需要对不同维度进行拆分);
-
对代码进行多维度拓展时,如功能/技术/业务维度等.
优缺点
优点:
-
通过分离对象中实体和功能维度的方式解耦了其固有的绑定关系, 使得实体和抽象可以沿着各自的维度灵活的进行拓展;
-
提供了比多层继承更优的解决方案(多层继承复用性差, 子类数量庞大, 违背了单一职责原则);
-
提高了系统的拓展性, 不同维度中任意一个维度的拓展都不需要修改原有系统, 符合开闭原则.
缺点:
-
增加了系统的设计和理解难度. 由于关联关系建立在抽象层, 所以要求设计者从一开始就要对抽象层进行良好的设计;
-
需要正确识别出系统中的不同维度并进行拆分, 需要开发者有较为丰富的开发经验.