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 {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}public class BlueColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying blue color");}
}


```

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

```java

public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {color.applyColor();System.out.println("Drawing Circle");}
}public class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic 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.mzph.cn/pingmian/7685.shtml

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

相关文章

HackMyVM-Animetronic

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 feroxbuster steghide exiftool hydra ssh连接 提权 系统信息收集 socat提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7…

【无标题】程序设计和c语言-谭浩强配套(适合专升本)

一晃大半年没更新了,一直在备考,想着这几天把前段时间学的c语言给大家分享一下,在此做了一个专栏,有需要的小伙伴可私信获取。 说明:本专栏所有内容皆适合专升本复习资料,本人手上也有日常刷题整理的错题以…

KAN: Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接:https://arxiv.org/abs/2404.19756 代码链接:https://github.com/KindXiaoming/pyKAN 项目链接:https://kindxiaoming.github.io/pyKAN/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

数据结构——链表(精简易懂版)

文章目录 链表概述链表的实现链表的节点(单个积木)链表的构建直接构建尾插法构建头插法构建 链表的插入 总结 链表概述 1,链表(Linked List)是一种常见的数据结构,用于存储一系列元素。它由一系列节点&…

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 ,并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件,或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布

深度学习模型训练套路与验证套路以及如何使用GPU进行模型训练

完整的模型训练套路:代码模板 数据集以经典的 CIFAR10 为例。 这个例子是很简单的,可能不太实用,但重点是通过这个例子掌握一种模型训练的写法套路,因此很有必要学习。 import torch.optim import torchvision from torch impo…

java-串口通讯-连接硬件

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

leetcode 547.省份数量

思路&#xff1a;dfs 或者这道题用bfs也是可以的。 这道题有点迷惑性&#xff0c;这里的数组给的是无向图的数组&#xff0c;而并不是地图&#xff0c;这里需要着重注意一下。 而后&#xff0c;这里的状态数组st没必要是二维的&#xff0c;我们并不会去遍历所给的数组&#…

拥抱新质生产力,助力新型工业化!CMM电子展暨IARS机器人展5月东莞盛大起航

2024年5月15-17日&#xff0c;东浩兰生会展集团旗下CMM电子展&#xff06;IARS机器人展将在广东现代国际展览中心&#xff08;东莞厚街&#xff09;举办。展会面积达50000平方米&#xff0c;展示品牌700余个&#xff0c;同期论坛峰会30余场&#xff0c;预计专业观众超50000人次…

代码随想录训练营Day25:贪心算法:加油站、分发糖果和K次取反的最大数组和

1.1005K次取反后最大化的数组和 贪心策略&#xff1a;先按照绝对值的大小进行排序&#xff0c;绝对值大的排在前面&#xff0c;然后按照顺序&#xff0c;如果存在负值就翻转直到用完k次&#xff0c;或者遍历完之后&#xff0c;将最小的那个进行翻转即可。 class Solution { p…

a表存在b表不存在的数据

第二种&#xff1a;在卡法中最常见的left join 方法&#xff0c;实现数据的过滤。 SELECT * FROM A LEFT JOIN B ON A.IdB.Id WHERE 11 AND B.Id IS NULL;

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode&#xff0c;在本地开发切换分支时&#xff0c;报以下错误&#xff1a; error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令&#xff0c;查看本地及远程的所有分支。 git branch -a 若没有对应的分…

【第12章】spring-mvc自定义类型转换器

文章目录 前言一、请求对象二、自定义转换器三、注册转换器四、控制器五、执行顺序六、执行结果总结 前言 【第6章】spring类型转换器 在spring系列已经介绍了类型转换器、接下来我们通过案例了解下转换器在SpringMvc中的应用。 场景模拟&#xff1a;我们接收到客户端请求,解析…

【MyBatisPlus】代码生成器、条件分页查询

代码生成器 第一步 引入依赖 <!-- mybatisPlus的代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.1</version></dependency>第二步 创…

极验4 一键解混淆

提示&#xff01;本文章仅供学习交流&#xff0c;严禁用于任何商业和非法用途&#xff0c;未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;如有侵权&#xff0c;可联系本文作者删除&#xff01; AST简介 AST&#xff08;Abstract Syntax Tree&#xff09;&a…

Linux专栏03:使用Xshell远程连接云服务器

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 使用Xshell远程连接云服务器 编号&#xff1a;03 文章目录 使用Xsh…

Redis学习(九)|如何保证MySQL和Redis的数据一致性

文章目录 引言什么是数据一致性为什么会出现不一致的情况如何保证一致性分布式事务异步更新策略双写模式缓存失效策略定时同步策略 结论 引言 数据一致性是任何系统设计中至关重要的一个方面。在涉及到同时使用Redis和MySQL的场景中&#xff0c;保证两者之间的数据一致性尤为重…

Redis 中,集合(Set)

在 Redis 中&#xff0c;集合&#xff08;Set&#xff09;是一种无序的、由字符串组成的数据结构。集合中的每个元素都是唯一的&#xff0c;即集合不允许重复的元素。Redis 集合通过哈希表实现&#xff0c;添加、删除、查找元素的操作都能在平均常数时间内完成。 ### 集合的特…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…