惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
T
Tailwind CSS Blog
V
Visual Studio Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
月光博客
月光博客
H
Hacker News: Front Page
D
DataBreaches.Net
GbyAI
GbyAI
Recorded Future
Recorded Future
IT之家
IT之家
H
Heimdal Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Schneier on Security
Schneier on Security
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security Affairs
博客园 - 三生石上(FineUI控件)
M
MIT News - Artificial intelligence
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
L
LangChain Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
The Last Watchdog
The Last Watchdog
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News - Newest:
Hacker News - Newest: "LLM"
Stack Overflow Blog
Stack Overflow Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
U
Unit 42
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
T
Tenable Blog
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
B
Blog
S
Security @ Cisco Blogs
A
About on SuperTechFans
V
V2EX
T
The Exploit Database - CXSecurity.com

博客园 - 欢乐豆123

软件设计师考试 - 有限自动机 软件设计师考试 - 排序算法 哈夫曼树以及哈夫曼编码 软件设计师案例题型 - DFD(数据流图) 软件设计师考试 - 二分查找 软件设计师考试 - Gantt图与PERT图(项目管理) 软件设计师考试 - 数据表示(原码、反码、补码、移码) 软件设计师考试 - 上午题型分析 软件设计师考试 - 下午题型分析 软件设计师考试-应用技术 内存溢出问题 常见的算法类型 排序算法的介绍 微信生态梳理 海明码介绍 Elasticsearch 实战:基于 function_score 的搜索与权重排序 Nexus的简单介绍以及如何上传自定义包 设计模式简介 jmeter压测 sdkman-管理多个版本的JDK SpringBoot中使用Aop统一拦截MQ消息处理 项目管理流程以及规范 Java-泛型的使用
设计模式-桥接模式(Bridge Pattern)
欢乐豆123 · 2025-08-26 · via 博客园 - 欢乐豆123

设计模式-桥接模式(Bridge Pattern)

  概要

  记忆关键词:抽象和实现分离

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

  分析:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。

  类型:结构型

  桥接模式结构图如下

img

    一、涉及相关角色

   1.  抽象部分

   系统对外提供的高层接口,代表抽象的业务维度。

   说明:在下面示例中,形状(Shape)是抽象部分,它定义了一个绘制形状的接口,比如 draw() 方法,但不关心具体颜色如何实现。

   2. 扩充抽象部分

   在抽象部分的基础上,增加额外的功能或具体行为。

   说明:在下面示例中,圆形(Circle)、正方形(Square)等具体形状类,它们在 draw() 方法中调用颜色的实现。

   3.  实现部分

   描述抽象部分所依赖的操作接口,是另一个独立变化的维度。被抽象部分组合,完成具体实现。抽象部分通过该接口与实现部分解耦,而不是依赖具体实现。

   说明:在下面示例中,颜色(Color)就是实现部分,比如红色、蓝色,它只定义颜色的行为接口

   4.  具体实现部分

   实现部分接口的具体类,完成实际的业务逻辑。

   说明:在下面示例中颜色(Color)具体实现类有白色、灰色、黑色,它们都实现了颜色接口,完成实际业务逻辑。

   二、示例代码

    1. 实现部分

 1 public interface Color {
 2     void paint(String shape);
 3 }
 4 public class Black implements Color {
 5     @Override
 6     public void paint(String shape) {
 7         System.out.println("黑色的" + shape);
 8     }
 9 }
10 public class White implements Color {
11     @Override
12     public void paint(String shape) {
13         System.out.println("白色的" + shape);
14     }
15 }
16 public class Gray implements Color {
17     @Override
18     public void paint(String shape) {
19         System.out.println("灰色的" + shape);
20     }
21 }

    2. 抽象部分

public abstract class Shape {
    Color color; // 桥接到实现部分

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

public class Rectangle extends Shape{
    @Override
    public void draw() {
        color.paint("长方形");
    }
}

public class Square extends Shape {
    @Override
    public void draw() {
      color.paint("正方形");
    }
}

public class Circle extends Shape{
    @Override
    public void draw() {
        color.paint("圆形");
    }
}

   三、优缺点分析
    1.  优点

  • 抽象与实现分离:将抽象部分和实现部分分离,减少它们之间的耦合,使系统更灵活。
  • 提高系统扩展性:抽象和实现可以沿着不同的维度独立扩展,不会相互影响。
  • 符合开闭原则:新增抽象类或实现类时无需修改现有代码,扩展更容易。
  • 运行时动态组合:抽象和实现可以在运行时动态绑定,而不是编译期固定。
  • 减少子类数量:相比多维度继承的方式,桥接模式用组合替代继承,避免类爆炸。

    2.  缺点

  • 增加系统复杂度:引入桥接层,增加了类的数量和代码复杂度,对初学者理解不直观。
  • 设计难度较高: 需要在系统设计阶段明确抽象维度,提前规划,否则后续改造成本大。
  • 过度设计风险如果系统只有一个维度变化,使用桥接模式会显得多此一举。

    四、适用场景

   JDBC 驱动是桥接模式的经典应用。如果我们想要把 MySQL 数据库切换成 Oracle 数据库,只需要更换数据库驱动,动一行代码就可以实现了

   支付系统 → 支付方式(实现部分) + 支付渠道(抽象部分)

   日志系统 → 日志级别(抽象部分) + 输出方式(实现部分)