当前位置: 首页 > news >正文

软件工程学习日志2025.11.10

在软件设计中,我们经常会遇到需要处理多个维度变化的场景。今天,我们将通过一个生动的例子——"在路上开车"问题,来深入探讨桥接模式(Bridge Pattern)的应用。这个例子中,车辆可以是小汽车或公交车,道路可以是水泥路或沥青路,两个维度独立变化,这正是桥接模式的用武之地。

什么是桥接模式?

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。这种模式通过提供桥接结构来解决多重继承带来的问题,并提高了系统的可扩展性。

核心思想

• 分离抽象与实现:将抽象部分和实现部分解耦

• 组合优于继承:使用组合关系代替继承关系

• 两个维度独立变化:抽象部分和实现部分可以独立扩展

问题分析:车辆与道路的组合

我们要解决的问题是模拟不同车辆在不同道路上行驶的场景:

• 车辆维度:小汽车(Car)、公交车(Bus)

• 道路维度:水泥路(CementRoad)、沥青路(AsphaltRoad)

如果不使用设计模式,我们可能会面临"类爆炸"的问题:CarOnCement、CarOnAsphalt、BusOnCement、BusOnAsphalt... 而桥接模式可以优雅地解决这个问题。

类图设计

classDiagram
%% 实现部分接口 - 道路
interface Road {
<>
+runOn() void
}

%% 具体道路实现类
class CementRoad {+runOn() void
}class AsphaltRoad {+runOn() void
}%% 抽象部分 - 车辆
abstract class Vehicle {#road: Road+Vehicle(road: Road)+drive()* void+setRoad(road: Road) void
}%% 具体车辆类
class Car {+Car(road: Road)+drive() void
}class Bus {+Bus(road: Road)+drive() void
}%% 实现关系
CementRoad ..|> Road
AsphaltRoad ..|> Road%% 继承关系
Car --|> Vehicle
Bus --|> Vehicle%% 关联关系(桥接核心)
Vehicle --> Road : 桥接

代码实现

  1. 道路接口及实现类

/**

  • 道路接口 - 实现部分
  • 定义道路的基本操作
    */
    interface Road {
    void runOn();
    }

/**

  • 水泥路具体实现
    */
    class CementRoad implements Road {
    @Override
    public void runOn() {
    System.out.println("在水泥路上行驶");
    }
    }

/**

  • 沥青路具体实现
    */
    class AsphaltRoad implements Road {
    @Override
    public void runOn() {
    System.out.println("在沥青路上行驶");
    }
    }
  1. 车辆抽象类及具体类

/**

  • 车辆抽象类 - 抽象部分

  • 包含对实现部分(道路)的引用
    */
    abstract class Vehicle {
    protected Road road;

    public Vehicle(Road road) {
    this.road = road;
    }

    /**

    • 驾驶方法 - 由子类具体实现
      */
      public abstract void drive();

    /**

    • 设置道路 - 允许动态切换道路
      */
      public void setRoad(Road road) {
      this.road = road;
      }
      }

/**

  • 小汽车具体类
    */
    class Car extends Vehicle {
    public Car(Road road) {
    super(road);
    }

    @Override
    public void drive() {
    System.out.print("小汽车");
    road.runOn();
    }
    }

/**

  • 公交车具体类
    */
    class Bus extends Vehicle {
    public Bus(Road road) {
    super(road);
    }

    @Override
    public void drive() {
    System.out.print("公交车");
    road.runOn();
    }
    }

  1. 测试类

/**

  • 桥接模式演示类
    */
    public class BridgePatternDemo {
    public static void main(String[] args) {
    // 创建不同的道路
    Road cementRoad = new CementRoad();
    Road asphaltRoad = new AsphaltRoad();

     System.out.println("=== 基本组合测试 ===");// 小汽车在不同道路上行驶Vehicle carOnCement = new Car(cementRoad);carOnCement.drive();Vehicle carOnAsphalt = new Car(asphaltRoad);carOnAsphalt.drive();// 公交车在不同道路上行驶Vehicle busOnCement = new Bus(cementRoad);busOnCement.drive();Vehicle busOnAsphalt = new Bus(asphaltRoad);busOnAsphalt.drive();System.out.println("\n=== 动态切换测试 ===");// 动态切换道路Vehicle car = new Car(cementRoad);car.drive();car.setRoad(asphaltRoad); // 切换到沥青路car.drive();System.out.println("\n=== 扩展性测试 ===");// 未来扩展:新增电动车和石子路// 只需要新增具体类,无需修改现有代码
    

    }
    }

运行结果

=== 基本组合测试 ===
小汽车在水泥路上行驶
小汽车在沥青路上行驶
公交车在水泥路上行驶
公交车在沥青路上行驶

=== 动态切换测试 ===
小汽车在水泥路上行驶
小汽车在沥青路上行驶

=== 扩展性测试 ===

桥接模式的优势

  1. 解决类爆炸问题

如果使用继承,4种组合需要4个类,如果维度增加,类的数量会呈指数级增长。桥接模式只需要2+2=4个类。

  1. 符合开闭原则

• 对扩展开放:可以轻松添加新的车辆类型或道路类型

• 对修改关闭:添加新功能不需要修改现有代码

  1. 提高灵活性

• 可以在运行时动态切换实现部分

• 抽象部分和实现部分可以独立变化和扩展

  1. 更好的可读性和维护性

代码结构清晰,职责分明,便于理解和维护。

实际应用场景

桥接模式在现实开发中有广泛的应用:

  1. 图形界面开发:不同平台(Windows、Mac)上的不同控件(按钮、文本框)
  2. 数据库访问:不同数据库(MySQL、Oracle)的不同操作(增、删、改、查)
  3. 消息发送:不同消息类型(文本、图片)通过不同渠道(邮件、短信)
  4. 支付系统:不同支付方式(支付宝、微信)处理不同货币(人民币、美元)
http://www.jsqmd.com/news/36968/

相关文章:

  • 172. 阶乘后的零
  • 2025 年 11 月储罐厂家推荐排行榜,钢衬塑储罐,钢塑复合储罐,化工储罐,防腐储罐,PE储罐,盐酸储罐,硫酸储罐,聚丙烯储罐,不锈钢储罐,次氯酸钠储罐公司推荐
  • AWS云从业者认证学习指南与练习平台
  • 微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。
  • Oracle LogMiner实战指南:误删误改数据的救命稻草
  • Spring 事务 - 实践
  • 2025 年 11 月危险品运输厂家推荐排行榜,危险品运输车,危险品运输罐,危险品运输物流,危险品运输公司专业实力与安全服务深度解析
  • Spring AI Alibaba 项目源码学习(二)-Graph 定义与描述分析
  • 20232422 2024-2025-1 《网络与系统攻防技术》实验四实验报告
  • SpringBoot热启动
  • SPI 设备与多从机冲突的解决之道:片选管理、CS 去抖与总线隔离策略 - 实践
  • 2025 年 11 月超声波检测设备厂家推荐排行榜,超声波检测系统,相控阵/高频/水浸/液冷板/钎焊超声波检测,高频相控阵超声波检测设备厂家推荐
  • 对于生成虚tree进行DP——CF1097G Vladislav and a Great Legend
  • 2025 年 11 月除蜡水厂家推荐排行榜,钢铁除蜡水,不锈钢除蜡水,金属除蜡水,工业除蜡水公司推荐
  • 使用napi-rs,通过node调用rust代码
  • 20232309 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 智语写作都有哪些功能?看这一篇就够了!智语写作全功能详解
  • pythontip 字符串转为字典
  • Microsoft Activation Scripts (MAS)
  • rufus.ini
  • 团队作业2
  • Explorer++
  • Interpretability-Guided Test-Time Adversarial Defense
  • JavaWeb04-JUnit
  • 2025 年 11 月开窗器厂家推荐排行榜,链条开窗器,机芯开窗器,配件开窗器,电动开窗器公司推荐
  • 详细介绍:用户体验就是新SEO:如何同时提升搜索者满意度和搜索排名
  • P6688 可重集 笔记
  • 哪款学习机适合小学生用?2025年11月多款主流品牌告诉你如何选
  • AIGC系统
  • noip5