0120_桥接模式(Bridge)

桥接模式(Bridge)

意图

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

UML 图

Bridge

优点

  1. 分离抽象和实现:将抽象接口与实现细节彻底分离,两者可以独立演化
  2. 提高扩展性:可以独立地对抽象部分和实现部分进行扩展,而不影响对方
  3. 实现细节对客户透明:客户端只需要关注抽象接口,不需要了解具体的实现细节
  4. 符合开闭原则:增加新的抽象或实现都很方便,不需要修改现有代码
  5. 减少子类数量:避免了使用继承带来的多层次类结构

缺点

  1. 增加系统复杂度:需要识别出系统中两个独立变化的维度
  2. 设计难度较高:需要正确地识别抽象和实现的边界
  3. 接口设计需要稳定:抽象接口需要相对稳定,否则会影响实现部分
  4. 理解成本较高:对于简单的系统,使用桥接模式可能显得过于复杂

代码示例

以人类和机器人为例,两者都有工作和休息的行为,但具体实现方式不同。使用桥接模式将行为抽象与具体实现分离:

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标准库和框架中有广泛应用:

  1. JDBC驱动程序

    // DriverManager作为抽象,具体的数据库驱动作为实现
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
    // 抽象(JDBC API)与实现(具体数据库驱动)分离
    
  2. AWT/Swing图形组件

    // Button作为抽象,Peer作为实现(不同平台的按钮实现)
    Button button = new Button("Click me");
    // 跨平台的抽象与特定平台的实现分离
    
  3. Java日志框架

    // Logger作为抽象,具体的日志实现(Log4j、JUL等)作为实现
    Logger logger = Logger.getLogger(MyClass.class);
    logger.info("This is a message");
    // 日志API抽象与具体日志实现分离
    
  4. 集合框架中的视图

    // Collections.unmodifiableList()创建不可修改列表视图
    List<String> originalList = new ArrayList<>();
    List<String> unmodifiableList = Collections.unmodifiableList(originalList);
    // 抽象(不可修改视图)与实现(原始列表)分离
    

总结

桥接模式通过将抽象部分与实现部分分离,使得两者可以独立变化,提高了系统的灵活性和可扩展性。它特别适用于存在多个独立变化维度的系统,通过组合代替继承,避免了类爆炸的问题。在实际应用中,桥接模式常用于跨平台开发、驱动程序设计、GUI开发等场景。

posted @ 2025-09-04 08:41  庞去广  阅读(9)  评论(0)    收藏  举报