0120_桥接模式(Bridge)
桥接模式(Bridge)
意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
UML 图

优点
- 分离抽象和实现:将抽象接口与实现细节彻底分离,两者可以独立演化
- 提高扩展性:可以独立地对抽象部分和实现部分进行扩展,而不影响对方
- 实现细节对客户透明:客户端只需要关注抽象接口,不需要了解具体的实现细节
- 符合开闭原则:增加新的抽象或实现都很方便,不需要修改现有代码
- 减少子类数量:避免了使用继承带来的多层次类结构
缺点
- 增加系统复杂度:需要识别出系统中两个独立变化的维度
- 设计难度较高:需要正确地识别抽象和实现的边界
- 接口设计需要稳定:抽象接口需要相对稳定,否则会影响实现部分
- 理解成本较高:对于简单的系统,使用桥接模式可能显得过于复杂
代码示例
以人类和机器人为例,两者都有工作和休息的行为,但具体实现方式不同。使用桥接模式将行为抽象与具体实现分离:
1. 实现接口 (Implementation Interface)
// 行为实现接口
public interface BehaviorImplementation {
void work();
void rest();
}
// 人类行为实现
public class HumanBehavior implements BehaviorImplementation {
@Override
public void work() {
System.out.println("人类在工作:使用大脑思考,用手操作工具");
}
@Override
public void rest() {
System.out.println("人类在休息:睡觉、吃饭、娱乐");
}
}
// 机器人行为实现
public class RobotBehavior implements BehaviorImplementation {
@Override
public void work() {
System.out.println("机器人在工作:执行程序指令,完成机械操作");
}
@Override
public void rest() {
System.out.println("机器人在休息:进入待机模式,进行自我维护");
}
}
2. 抽象类 (Abstraction)
// 抽象角色
public abstract class Character {
protected BehaviorImplementation behavior;
public Character(BehaviorImplementation behavior) {
this.behavior = behavior;
}
public abstract void performWork();
public abstract void performRest();
public void setBehavior(BehaviorImplementation behavior) {
this.behavior = behavior;
}
}
// 精化抽象 - 上班族
public class Worker extends Character {
public Worker(BehaviorImplementation behavior) {
super(behavior);
}
@Override
public void performWork() {
System.out.print("上班族:");
behavior.work();
}
@Override
public void performRest() {
System.out.print("上班族:");
behavior.rest();
}
}
// 精化抽象 - 运动员
public class Athlete extends Character {
public Athlete(BehaviorImplementation behavior) {
super(behavior);
}
@Override
public void performWork() {
System.out.print("运动员:");
behavior.work();
}
@Override
public void performRest() {
System.out.print("运动员:");
behavior.rest();
}
}
3. 客户端代码 (Client Code)
public class BridgePatternTest {
public static void main(String[] args) {
// 创建不同的行为实现
BehaviorImplementation humanBehavior = new HumanBehavior();
BehaviorImplementation robotBehavior = new RobotBehavior();
// 人类上班族
System.out.println("========== 人类上班族 ==========");
Character humanWorker = new Worker(humanBehavior);
humanWorker.performWork();
humanWorker.performRest();
// 机器人上班族
System.out.println("\n========== 机器人上班族 ==========");
Character robotWorker = new Worker(robotBehavior);
robotWorker.performWork();
robotWorker.performRest();
// 人类运动员
System.out.println("\n========== 人类运动员 ==========");
Character humanAthlete = new Athlete(humanBehavior);
humanAthlete.performWork();
humanAthlete.performRest();
// 机器人运动员
System.out.println("\n========== 机器人运动员 ==========");
Character robotAthlete = new Athlete(robotBehavior);
robotAthlete.performWork();
robotAthlete.performRest();
// 动态切换行为
System.out.println("\n========== 行为切换示例 ==========");
Character character = new Worker(humanBehavior);
character.performWork();
// 切换到机器人行为
character.setBehavior(robotBehavior);
character.performWork();
}
}
在Java标准库中的应用
桥接模式在Java标准库和框架中有广泛应用:
-
JDBC驱动程序
// DriverManager作为抽象,具体的数据库驱动作为实现 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test"); // 抽象(JDBC API)与实现(具体数据库驱动)分离 -
AWT/Swing图形组件
// Button作为抽象,Peer作为实现(不同平台的按钮实现) Button button = new Button("Click me"); // 跨平台的抽象与特定平台的实现分离 -
Java日志框架
// Logger作为抽象,具体的日志实现(Log4j、JUL等)作为实现 Logger logger = Logger.getLogger(MyClass.class); logger.info("This is a message"); // 日志API抽象与具体日志实现分离 -
集合框架中的视图
// Collections.unmodifiableList()创建不可修改列表视图 List<String> originalList = new ArrayList<>(); List<String> unmodifiableList = Collections.unmodifiableList(originalList); // 抽象(不可修改视图)与实现(原始列表)分离
总结
桥接模式通过将抽象部分与实现部分分离,使得两者可以独立变化,提高了系统的灵活性和可扩展性。它特别适用于存在多个独立变化维度的系统,通过组合代替继承,避免了类爆炸的问题。在实际应用中,桥接模式常用于跨平台开发、驱动程序设计、GUI开发等场景。

浙公网安备 33010602011771号