软件工程学习日志2025.11.10

news/2025/11/10 22:34:27/文章来源:https://www.cnblogs.com/dynastyeast/p/19208478

在软件设计中,我们经常会遇到需要处理多个维度变化的场景。今天,我们将通过一个生动的例子——"在路上开车"问题,来深入探讨桥接模式(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.mzph.cn/news/961808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

172. 阶乘后的零

题目链接:172. 阶乘后的零 - 力扣(LeetCode)解析: 方法一:数学n! 尾零的数量即为 n! 中因子 10 的个数,而 10=25,因此转换成求 n! 中质因子 2 的个数和质因子 5 的个数的较小值。 由于质因子 5 的个数不会大于质…

2025 年 11 月储罐厂家推荐排行榜,钢衬塑储罐,钢塑复合储罐,化工储罐,防腐储罐,PE储罐,盐酸储罐,硫酸储罐,聚丙烯储罐,不锈钢储罐,次氯酸钠储罐公司推荐

2025年11月储罐厂家推荐排行榜:专业选购指南与权威榜单 在化工、制药、环保等工业领域,储罐作为关键设备,其性能和质量直接关系到生产安全与运营效率。随着技术进步和市场需求多样化,各类储罐如钢衬塑储罐、钢塑复…

AWS云从业者认证学习指南与练习平台

本项目提供完整的AWS云从业者认证(CLF-C02)学习资源,包含详细的学习笔记、思维导图、23套模拟试题和在线练习平台,帮助考生系统掌握云计算概念、AWS服务、安全架构等核心知识点,高效备考认证考试。AWS云从业者认证学…

微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。

本文对比单体架构与微服务架构,指出架构选择应基于业务需求,无绝对好坏。单体架构简单直接、适合业务初期;微服务架构灵活可扩展、适合大型项目。强调架构应渐进演进,根据团队规模和发展阶段灵活选择。文 / 勇哥 原…

2025 年 11 月扒胎机厂家推荐排行榜,液压无损扒胎机,全自动扒胎机,汽保扒胎机,轮胎扒胎机,汽车扒胎机公司推荐

2025年11月扒胎机厂家推荐排行榜:液压无损扒胎机与全自动扒胎机选购指南 行业背景与发展现状 随着汽车保有量的持续增长和汽车后服务市场的快速发展,扒胎机作为汽保设备领域的重要工具,其技术水平和产品性能不断提升…

Oracle LogMiner实战指南:误删误改数据的救命稻草

Oracle LogMiner实战指南:误删误改数据的救命稻草作为DBA,最令人心惊肉跳的时刻莫过于业务同学突然惊呼:"核心数据被误删/误改了!"如果此时备份缺失或已过时,你是否想过只能跑路?别慌!Oracle提供了一…

Spring 事务 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月危险品运输厂家推荐排行榜,危险品运输车,危险品运输罐,危险品运输物流,危险品运输公司专业实力与安全服务深度解析

2025年11月危险品运输厂家推荐排行榜:危险品运输车、危险品运输罐、危险品运输物流、危险品运输公司专业实力与安全服务深度解析 行业背景与发展现状 危险品运输作为特种物流领域的重要组成部分,承载着化工、能源、医…

Spring AI Alibaba 项目源码学习(二)-Graph 定义与描述分析

Graph 定义与描述分析 请关注公众号:阿呆-bot 概述 本文档分析 spring-ai-alibaba-graph-core 模块中 Graph 的定义和描述机制,包括入口类、关键类关系、核心实现代码和设计模式。 入口类说明 StateGraph - Graph 定…

20232422 2024-2025-1 《网络与系统攻防技术》实验四实验报告

20232312 2024-2025-1 《网络与系统攻防技术》实验四实验报告

SpringBoot热启动

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency>设置确…

SPI 设备与多从机冲突的解决之道:片选管理、CS 去抖与总线隔离策略 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月超声波检测设备厂家推荐排行榜,超声波检测系统,相控阵/高频/水浸/液冷板/钎焊超声波检测,高频相控阵超声波检测设备厂家推荐

2025 年 11 月超声波检测设备厂家推荐排行榜,超声波检测系统,相控阵/高频/水浸/液冷板/钎焊超声波检测,高频相控阵超声波检测设备厂家推荐 行业技术发展背景 超声波检测技术作为现代工业无损检测的重要手段,在材料…

对于生成虚tree进行DP——CF1097G Vladislav and a Great Legend

对于生成虚tree进行DP——CF1097G Vladislav and a Great Legend 首先 \[\sum_Xf^k(X)=\sum_{i=1}^k{k \brace i}i!\sum_X{F(X)\choose i} \]考虑如何 \(dp\) \(\sum_X{F(X)\choose i}\)。 设 \(f_{x,i}\) 表示考虑 \(…

2025 年 11 月除蜡水厂家推荐排行榜,钢铁除蜡水,不锈钢除蜡水,金属除蜡水,工业除蜡水公司推荐

2025年11月除蜡水厂家推荐排行榜:专业解析钢铁除蜡水与金属表面处理技术 在当今精密制造与金属加工行业快速发展的背景下,除蜡水作为金属表面处理的关键制剂,其性能优劣直接影响着工件的清洁度与产品质量。钢铁除蜡…

使用napi-rs,通过node调用rust代码

0、node版本建议在16以上 1、安装napi-rs npm init -y npm install @napi-rs/cli --save-dev2、初始化一个 napi 项目 npx @napi-rs/cli new my-rust-addon # 如果这句不行就试试 npx napi new my-rust-addon3、进入my…

20232309 2025-2026-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 1.1学习内容 1.恶意代码分析方法(静态分析、动态分析等) 2.PEiD、IDA Pro、ProcessExplorer等分析工具的使用方法 1.2实验任务恶意代码文件类型标识、脱壳与字符串提取 使用IDA Pro静态或动态分析crackme…

智语写作都有哪些功能?看这一篇就够了!智语写作全功能详解

作为AI写小说全能工具箱的智语写作,功能非常丰富,其AI生成能力可覆盖小说、短剧、公众号、视频等创作全流程。 本篇文章,就来给大家详细介绍一下这些功能。 一、AI辅助创作功能:已对接GPT、Gemini、claude、grok、…

pythontip 字符串转为字典

编写一个程序将字符串转换为字典。 定义函数convert_str_list_to_dict(),参数为str_list(输入的字符串)。 在函数内部,创建一个字典,其中每个字符串使用=进行分割,第一部分为键,第二部分为值。 返回字典。先用字符…

Microsoft Activation Scripts (MAS)

GitHub - massgravel/Microsoft-Activation-Scripts: Open-source Windows and Office activator featuring HWID, Ohook, TSforge, KMS38, and Online KMS activation methods, along with advanced troubleshooting.…