java设计模式 桥接

桥接模式(Bridge Pattern)是软件工程中的一种设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

### 案例背景

假设我们正在开发一个图形编辑器,其中包含多种形状(如圆形、矩形等),每种形状都有多种颜色可以选择绘制。如果直接将形状和颜色的属性混合在同一个类中,那么每增加一种形状或颜色,就需要创建一个新的类,这将导致类的数量爆炸式增长。使用桥接模式,我们可以将形状和颜色的职责分开,使得新增形状或颜色时,不需要修改已有的类,提高了系统的可扩展性和灵活性。

### 源代码示例

#### 1. 抽象形状(Shape)

```java

public abstract class Shape {
    protected Color color;

    public Shape(Color color) {
        this.color = color;
    }

    public abstract void draw();
}


```

#### 2. 颜色接口(Color)

```java

public interface Color {
    void applyColor();
}


```

#### 3. 具体颜色实现(RedColor, BlueColor)

```java

public class RedColor implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying red color");
    }
}

public class BlueColor implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying blue color");
    }
}


```

#### 4. 具体形状实现(Circle, Rectangle)

```java

public class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        color.applyColor();
        System.out.println("Drawing Circle");
    }
}

public class Rectangle extends Shape {
    public Rectangle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        color.applyColor();
        System.out.println("Drawing Rectangle");
    }
}


```

### 使用案例

```java

public class BridgePatternDemo {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new RedColor());
        Shape blueRectangle = new Rectangle(new BlueColor());

        redCircle.draw();
        blueRectangle.draw();
    }
}


```

### 输出结果

```

Applying red color
Drawing Circle
Applying blue color
Drawing Rectangle


```

### 分析

在这个例子中,`Shape`类是抽象部分,定义了绘制形状的行为,但不涉及具体的颜色实现;`Color`接口及其实现类(如`RedColor`, `BlueColor`)是实现部分,负责应用颜色。通过构造函数,`Shape`的子类(如`Circle`, `Rectangle`)与`Color`的实例关联起来,实现了抽象和实现的解耦。当需要添加新的形状或颜色时,只需扩展相应的抽象或实现类即可,符合开闭原则,提高了代码的可维护性和扩展性。

### 桥接模式的关键点和优势

#### 关键点:
1. **分离抽象**:桥接模式的核心在于将抽象部分(如形状的逻辑)与它的实现部分(如颜色的具体表现)分离。这样做的目的是让这两者可以独立地变化和发展,互不影响。
2. **多维度变化**:该模式特别适用于系统需要应对多个维度的变化时。比如上例中的形状和颜色就是两个不同的变化维度,桥接模式允许我们对每个维度独立扩展。
3. **减少类爆炸**:通过组合而非继承来实现功能的扩展,避免了因为组合功能而产生的大量子类,减少了系统的复杂度。

#### 优势:
1. **高扩展性**:新增形状或颜色时,只需要增加相应的实现类,原有代码无需改动,系统容易扩展。
2. **高灵活性**:抽象和实现的分离使得两者可以灵活组合,易于调整实现策略,提高系统的灵活性。
3. **遵循开闭原则**:对扩展开放,对修改关闭。增加新的形状或颜色不需要修改现有的类,符合软件设计的最佳实践。
4. **优化复杂系统结构**:对于那些有多维度分类并且需要经常面对需求变化的系统,桥接模式能够显著优化其结构,使其更易于管理和维护。

### 实际应用场景举例

- **GUI编程**:在图形用户界面编程中,可以将窗口部件的外观(如按钮的皮肤)与功能(如点击响应)分离,便于更换皮肤而不影响功能逻辑。
- **数据库驱动开发**:数据库访问的接口与具体数据库实现(如MySQL、Oracle)分离,方便切换数据库。
- **操作系统与硬件设备**:操作系统提供的设备驱动接口与具体的硬件设备实现分离,使得系统能兼容不同型号的硬件。

通过上述分析和案例,可以看到桥接模式在处理多维度变化、保持系统结构清晰和易于扩展方面具有显著的优势,是解决特定设计问题的有效工具。

### 桥接模式与其他设计模式的关系及使用注意事项

#### 与其他设计模式的关系:

1. **与适配器模式**:两者都涉及接口转换,但目的不同。适配器模式主要用于让不兼容的接口协同工作,而桥接模式则是为了将抽象和实现解耦,支持独立变化。
   
2. **与装饰者模式**:装饰者模式动态地给对象添加额外的职责,侧重于行为的扩展;桥接模式则关注将抽象与实现分离,以应对不同维度的变化。装饰者模式通常会导致更多的对象层级,而桥接模式通过组合而非继承来实现。

3. **与策略模式**:策略模式定义了一系列算法,并让它们之间可以互相替换。桥接模式虽然也涉及替换,但它关注的是两个维度的分离,而策略模式主要聚焦于单一维度的算法选择。

#### 使用注意事项:

1. **识别变化维度**:在应用桥接模式前,首先要明确系统中哪些部分是相对稳定的,哪些部分可能频繁变化。确保变化的维度被正确识别,才能有效地应用此模式。

2. **避免过度设计**:虽然桥接模式提供了高度的灵活性和扩展性,但也可能引入不必要的复杂度。如果系统的需求相对简单,或者变化的可能性不大,过度使用桥接模式可能会得不偿失。

3. **平衡性能考虑**:通过组合实现分离可能会增加对象的数量,影响内存使用和性能。在追求设计灵活性的同时,也要评估并平衡这些潜在的性能影响。

4. **接口清晰定义**:桥接模式依赖于抽象层和实现层之间清晰的接口定义。良好的接口设计可以降低模块间的耦合度,提高系统的可维护性和可测试性。

5. **适时重构**:随着项目的发展,最初设计的抽象和实现可能会不再适用。及时重构,调整抽象和实现的界限,是保持系统健康发展的关键。

总之,桥接模式是一种强大的设计工具,能够有效应对多维度变化的系统设计挑战,但其应用需基于对系统需求的深入理解,合理设计,以达到最佳效果。

### 桥接模式在实际项目中的深入应用与变体

#### 在框架与库中的应用

- **前端框架的组件库**:在许多前端UI框架中,如Bootstrap或Ant Design,桥接模式被用于实现组件样式(如主题颜色、尺寸等)与组件功能的分离。用户可以通过配置轻松更换主题或调整组件外观,而无需改动组件的核心逻辑。

- **ORM框架**:在对象关系映射(ORM)框架中,如Hibernate或MyBatis,桥接模式用于连接面向对象的领域模型与关系型数据库的SQL查询,使得开发者可以在不修改数据库访问逻辑的情况下,更换或升级数据库。

#### 变体与进阶用法

1. **双桥接模式**:当系统存在两个以上的独立变化维度时,可以使用双桥接模式或多重桥接模式。这种情况下,会形成更复杂的组合结构,但能更精细地控制各部分的独立变化。

2. **动态桥接**:在某些场景下,桥接的具体实现可以在运行时动态决定。这通常涉及到工厂模式或策略模式来创建或选择合适的实现类,进一步增强了系统的灵活性。

3. **接口继承层次**:在复杂的系统中,抽象和实现的接口可能有各自的继承层次结构。正确设计这些层次,确保它们的演化不会相互干扰,是成功应用桥接模式的关键。

### 性能考量与优化

- **缓存机制**:对于频繁使用的形状和颜色组合,可以通过缓存已创建的对象实例来减少对象创建的开销,提升性能。
  
- **懒加载**:在大型系统中,不是所有形状和颜色的组合都会立即使用到。采用懒加载策略,即在真正需要时才创建具体的实现对象,可以有效减少内存占用。

- **轻量级实现**:确保实现类尽可能轻量,尤其是当它们被大量实例化时。避免在实现类中包含不必要的数据成员或操作,减少资源消耗。

### 总结

桥接模式通过将抽象与实现分离,为软件设计提供了一种灵活且可扩展的解决方案,特别是在处理多维度变化的场景中展现出其价值。然而,它的有效运用需要对系统需求有深刻的理解,并在设计时仔细权衡抽象与实现的界限、系统的复杂度与性能要求。通过不断实践与反思,开发者可以更加熟练地运用桥接模式,构建出既灵活又高效的软件系统。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【17-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

一文彻底读懂信息安全等级保护:包含等保标准、等保概念、等保对象、等保流程及等保方案(附:等保相关标准文档)

1. 什么是等级保护? 1.1. 概念 信息安全等级保护是指根据我国《信息安全等级保护管理办法》的规定,对各类信息系统按照其重要程度和保密需求进行分级,并制定相应的技术和管理措施,确保信息系统的安全性、完整性、可用性。根据等…

[C++][数据结构]哈希2:开散列/哈希桶的介绍和简单实现

前言 接着上一篇文章,我们知道了闭散列的弊端是空间利用率比较低,希望今天学习的开散列可以帮我们解决这个问题 引入 开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址**,具有相同地址的关键码归于同一子…

数据库表自增主键超过代码Integer长度问题

数据库自增主键是 int(10) unsigned类型的字段,int(M) 中 M指示最大显示宽度,不代表存储长度,实际int(1)也是可以存储21.47亿长度的数字,如果是无符号类型的,那么可以从0~42.94亿。 我们的表主键自增到21.47亿后&#…

英语学习笔记3——Sorry, sir.

Sorry, sir. 对不起,先生。 词汇 Vocabulary umbrella n. 伞,保护伞 注意读音 [ʌm’brelə] 英国人离不开雨伞。 please 请 特殊用法:让路(升调)      用餐礼仪(平调)      求求你…

大数据信用和征信报告的区别和联系,一定不要搞混了!

在当今数据驱动的社会,大数据的应用已经深入到各个领域。其中,大数据信用和征信报告成为金融、经济等领域中两个重要的概念。那么,大数据信用和征信报告有什么区别和联系呢? 一、定义与区别 1、大数据信用 大数据信用是指利用大数据技术&…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天,人工智能(AI)已经渗透到了我们生活的方方面面,从智能家居、智能医疗到自动驾驶、智能客服,AI无处不在。然而,当我们赞叹于AI的神奇时,却往往忽视了其背后的推动力——数学…

2024.5.10

TCP服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建…

泰尔指数和泰尔指数模型:代码、案例及复现

泰尔指数模型是衡量个人或地区收入差距的重要工具。参考朱红根(2023年)老师的方法,《农业经济问题》使用泰尔指数分析了中国不同地区数字乡村发展水平的差异。该资料包括了Stata全流程代码、案例数据、参考文献,并提供了Excel计算…

解决mybatis的配置文件没代码提示的问题

1.将org.apache.ibatis.builder.xml包里的两个dtd文件复制出来,jar包里复制 2.复制dtd的url地址: http://mybatis.org/dtd/mybatis-3-mapper.dtd 一样的做法! 3.关闭两个配置文件,重新打开,就可以有代码提示了&…

【Linux】Linux——Centos7安装Tomcat

1.下载Tomcat 安装包 官网地址:Apache Tomcat - Apache Tomcat 9 Software Downloadshttps://tomcat.apache.org/download-90.cgi 2.将下载的安装包上传到 Xftp 上,我是直接放到 usr 下了 3.将安装包解压到 /usr/local/ tar -zxvf apache-tomcat-9.0.8…

Java入门——类和对象(上)

经读者反映与笔者考虑,近期以及往后内容更新将主要以java为主,望读者周知、见谅。 类与对象是什么? C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 JAVA是基于面向对…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数(小数)float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释(或者多行注释) …

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题(对垂直权限进行校验) 文章目录 Java解决垂直鉴权问题(对垂直权限进行校验)前言一、垂直鉴权是什么?二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…

【LLM 论文】Chain-of-Verification:通过验证链来减少 LLM 幻觉

论文:Chain-of-Verification Reduces Hallucination in Large Language Models ⭐⭐⭐ arXiv:2309.11495 论文速读 LLM 由于不可避免地会产生幻觉,现有的研究主要鼓励 LLM 在产生 response 之前生成内部思想的推理链,或者通过 self-critique…

使用leafletjs实现地图洋流、风场气象6要素地图标注、等值面图

前期实现的功能由于数据失效无法显示效果,今天重新对接一个数据源进行展示,实现效果如下图: 访问地址:可视化三维 GIS 特效 - 沉浸式视觉体验呈现令人惊叹的三维 GIS 特效,提供沉浸式视觉体验。https://www.wheart.cn/…

HTTP有哪些失败原因?怎么处理?

在我们日常的网络活动中,http协议是不可或缺的,它负责在互联网上传输数据。然而,在使用HTTP协议进行数据传输时,我们可能会遇到一些失败的情况。这些失败的原因多种多样,包括但不限于服务器问题、网络问题、客户端问题…

RobbitMQ基本消息队列的消息发送过程

RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址:Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…