桥接模式的优点和典型实现

news2025/3/30 19:01:23

桥接模式的优点

桥接模式通过将抽象部分与实现部分分离,使得它们可以独立变化,从而提高系统的灵活性和可扩展性。以下是桥接模式的主要优点:

  1. 分离抽象和实现

    • 桥接模式将抽象部分和实现部分分离,使得两者可以独立变化。这有助于减少类的膨胀,提高代码的可维护性。
  2. 提高可扩展性

    • 由于抽象和实现是分离的,添加新的抽象或实现类时,不需要修改现有的代码。这使得系统更加灵活,易于扩展。
  3. 实现细节对客户端透明

    • 客户端只需要关注抽象部分,而不需要了解实现部分的细节。这提高了代码的封装性和模块化。
  4. 减少代码冗余

    • 通过组合而不是继承,减少了代码冗余。避免了由于多继承带来的复杂性和潜在的冲突问题。
  5. 动态切换实现

    • 客户端可以在运行时动态地切换实现部分,而不需要重新创建对象。这提高了系统的灵活性和适应性。

优秀框架中的实现

桥接模式在许多优秀的框架中都有应用,以下是一些典型例子:

1. Java I/O 系统

Java I/O 系统是一个典型的桥接模式应用。InputStreamOutputStream 是抽象部分,而 FileInputStreamByteArrayInputStream 等是实现部分。

  • 抽象部分

    public abstract class InputStream {
        public abstract int read() throws IOException;
        public abstract int read(byte[] b) throws IOException;
        // 其他抽象方法
    }
    
    public abstract class OutputStream {
        public abstract void write(int b) throws IOException;
        public abstract void write(byte[] b) throws IOException;
        // 其他抽象方法
    }
    
  • 实现部分

    public class FileInputStream extends InputStream {
        // 实现 read 方法
    }
    
    public class FileOutputStream extends OutputStream {
        // 实现 write 方法
    }
    
  • 装饰器

    • BufferedInputStreamBufferedOutputStream 通过组合 InputStreamOutputStream 来提供缓冲功能。
    • DataInputStreamDataOutputStream 通过组合 InputStreamOutputStream 来提供数据读写功能。
2. Java AWT 和 Swing

Java AWT 和 Swing 框架中也使用了桥接模式。Button 是抽象部分,而 MetalButtonUIMotifButtonUI 等是实现部分。

  • 抽象部分

    public abstract class Button {
        protected ButtonUI ui;
    
        public Button(ButtonUI ui) {
            this.ui = ui;
        }
    
        public void paint(Graphics g) {
            ui.paint(g, this);
        }
    
        // 其他抽象方法
    }
    
  • 实现部分

    public interface ButtonUI {
        void paint(Graphics g, Button b);
        // 其他方法
    }
    
    public class MetalButtonUI implements ButtonUI {
        public void paint(Graphics g, Button b) {
            // 金属风格的按钮绘制
        }
    }
    
    public class MotifButtonUI implements ButtonUI {
        public void paint(Graphics g, Button b) {
            // Motif 风格的按钮绘制
        }
    }
    
  • 具体抽象

    public class JButton extends Button {
        public JButton(ButtonUI ui) {
            super(ui);
        }
    
        // 其他具体方法
    }
    
3. Spring 框架

Spring 框架中的 JdbcTemplate 也使用了桥接模式。JdbcTemplate 是抽象部分,而 DataSource 是实现部分。

  • 抽象部分

    public class JdbcTemplate {
        private DataSource dataSource;
    
        public JdbcTemplate(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        public List query(String sql, RowMapper rowMapper) {
            // 使用 dataSource 执行查询
        }
    
        // 其他方法
    }
    
  • 实现部分

    public interface DataSource {
        Connection getConnection() throws SQLException;
        // 其他方法
    }
    
    public class DriverManagerDataSource implements DataSource {
        private String url;
        private String username;
        private String password;
    
        public DriverManagerDataSource(String url, String username, String password) {
            this.url = url;
            this.username = username;
            this.password = password;
        }
    
        public Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url, username, password);
        }
    }
    
    public class PooledDataSource implements DataSource {
        // 连接池的实现
    }
    

总结

桥接模式通过将抽象部分和实现部分分离,使得两者可以独立变化,从而提高了系统的灵活性和可扩展性。在实际应用中,桥接模式广泛应用于需要动态切换实现或减少类膨胀的场景。以下是一些桥接模式的典型优点:

  • 分离抽象和实现:提高代码的可维护性和可扩展性。
  • 实现细节对客户端透明:提高代码的封装性和模块化。
  • 减少代码冗余:通过组合而不是继承,减少代码冗余。
  • 动态切换实现:提高系统的灵活性和适应性。

在优秀框架中,桥接模式的应用使得这些框架更加灵活和强大,能够适应不同的需求和环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322470.html

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

相关文章

基于 mxgraph 实现流程图

mxgraph 可以实现复杂的流程图绘制。mxGraph里的Graph指的是图论(Graph Theory)里的图而不是柱状图、饼图和甘特图等图(chart),因此想找这些图的读者可以结束阅读了。 作为图论的图,它包含点和边,如下图所示。 交通图 横道图 架构图 mxGrap…

动态路由机制MoE专家库架构在多医疗AI专家协同会诊中的应用探析

随着医疗人工智能技术的飞速进步,AI在医学领域的应用日益增多,尤其是在复杂疾病的诊断和治疗中,AI技术的应用带来了巨大的潜力。特别是动态路由机制混合专家(Mixture of Experts,MoE)架构,因其灵活、高效的特点,正逐渐成为实现多AI专家协同会诊的关键技术。通过将多个不…

双工通信:WebSocket服务

(一)WebSocket概述 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输 注意;Websocket也只能由客户端先握…

洪水灌溉算法 + 总结

文章目录 floodfill算法图像渲染题解代码 岛屿数量题解代码 岛屿的最大面积题解代码 被围绕的区域题解代码 太平洋大西洋水流问题题解代码 扫雷游戏题解代码 衣橱整理题解代码 总结 floodfill算法 1. 寻找相同性质的联通块,可以使用dfs或者bfs解决,比如…

LangChain4j(1):初识LangChain4j

1 什么是LangChain和LangChain4j LangChain是一个大模型的开发框架,使用LangChain框架,程序员可以更好的利用大模型的能力,大大提高编程效率。如果你是一个lava程序员,那么对LangChain最简单直观的理解就是,LangChain…

Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程

文章目录 前言一、Photoshop 2025安装包下载二、Photoshop 2025安装教程1.解压安装包2.运行程序3.修改安装路径4.设安装目录5.开始安装6.等安装完成7.关闭安装向导8.启动软件9.安装完成 前言 无论你是专业设计师,还是初涉图像处理的小白,Photoshop 2025…

SQL Server安装程序无法启动:系统兼容性检查失败

问题现象: 运行 SQL Server 2022 安装程序时,提示 “硬件或软件不满足最低要求”,安装向导直接退出或无法继续。 快速诊断 操作系统版本检查: # 查看 Windows 版本(需 20H2 或更高) winver 支持的系统&…

期权合约作废的话,权利金和保证金会退还么?

在期权交易中,权利金是否可以退回,主要取决于期权的交易情况和合约条款。 期权作废的三种情形 一般来说期权作废一共有三种情况,分别是到期没有行权、主动放弃或者是标的退市了。 第一种是到期未行权,一般来说值得都是虚值期权&…

MIPI计算ECC和CRC工具介绍

一、MIPI简介 MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI官网https://mipi.org/…

医院管理系统(源码)分享

「医院管理系统(源码) 源码: https://pan.quark.cn/s/b6e21488fce3 第1章 绪论 1.1 项目背景 随着计算机科学的迅猛发展和互联网技术的不断推进,人们的生活方式发生了巨大的变化,同时也推动了整个软件产业的发展。把…

使用Geotools从DEM数据中读取指定位置的高程实战

目录 前言 一、GridCoverage2D对象介绍 1、GridCoverage2D的属性 2、GridCoverage2D核心方法 3、GridCoverage2D中的高级操作 二、指定位置的高程获取 1、存储原理 2、相关属性的获取 3、获取高程的方法 三、总结 前言 在地理信息科学领域,高程数据是至关重…

STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调

导言 GPIO设置输入模式后,一般会用轮询的方式去查看GPIO的电平状态。比如,最常用的案例是用于检测按钮的当前状态(是按下还是没按下)。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。 项目地址:https://github.…

直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启

从海量监控数据,到工业、能源、交通等场景中实时更新的各类传感器数据,时序数据正在以指数级速度增长。而面对如此庞杂的数据,如何快速分析、自动发现问题、精准预测未来,成为企业数字化转型过程中的关键挑战。 TDengine 的答案是…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu,并且出现下面的错误打印: [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知,​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略(MMORTS)沙盒游戏,其核心机制是通过编写JavaScript代码来控制游戏中的单位(称为“Creep”)&#…

Prometheus stack命令行接入springboot服务metrics

使用Prometheus Stack监控SpringBoot应用 本文将详细介绍如何使用Prometheus Stack监控SpringBoot应用的metrics。假设你已经安装了Kubernetes集群,并使用Helm安装了Prometheus Stack全家桶。SpringBoot应用已经配置好,暴露了相应的metrics端点。 Sprin…

Git Bash 设置Notepad++作为默认编辑器

网上搜的时候发现别人搞得有点复杂 (绝对正确的方法)Git Bash 设置Notepad作为默认编辑器_git 通过notpad 编辑器-CSDN博客 最简单的方式就是重新安装git,然后在选择编辑器的时候,勾选notepad即可

Qt 制作验证码

Qt 制作验证码 #include <QRandomGenerator> #include <QPainterPath> #include <QPainter>// 生成随机数 int r(int a,int b0){return b ? QRandomGenerator::global()->bounded(a, b): QRandomGenerator::global()->bounded(a); }// 生成随机多边形…

【数据结构】二叉树 — 经典OJ面试题剖析!!!

目录 二叉树相关oj题 1. 检查两颗树是否相同 2. 另一棵树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的层序遍历 8. 判断一棵树是不是完全二叉树 9. 二叉树的最近公共祖先 10. 根据前序与中序遍历序列构…

【MySQL】用户账户、角色、口令、PAM

目录 查看用户账户设置 连接 1.本地连接 2.远程连接 账户 角色 操作用户账户和角色 配置口令和账户有效期限 手工使口令过期 配置口令有效期限 PAM身份验证插件 客户端连接&#xff1a;使用 PAM 账户登录 在连接到MySQL服务器并执行查询时&#xff0c;会验证你的身…