当前位置: 首页 > news >正文

java设计模式四 桥接模式

桥接模式关注于将抽象部分与实现部分分离,使它们可以独立变化。它通过在抽象和实现之间建立一个桥梁来实现这一目的。这种设计模式属于结构型模式。

假设我们要设计一个图形编辑器,其中图形(如圆形、正方形)可以有不同的颜色填充。这里,形状(圆形、正方形)是抽象部分,颜色(红色、蓝色等)是实现部分。我们可以使用桥接模式来设计这个系统,使得新增形状或颜色不会影响到对方的代码。

首先,定义形状和颜色的接口:

```java

public interface Shape {void draw(Color color);
}public interface Color {String getColor();
}
```//接着,实现具体的形状和颜色类:```java
public class Circle implements Shape {@Overridepublic void draw(Color color) {System.out.println("Drawing a Circle filled with color: " + color.getColor());}
}public class Square implements Shape {@Overridepublic void draw(Color color) {System.out.println("Drawing a Square filled with color: " + color.getColor());}
}public class Red implements Color {@Overridepublic String getColor() {return "Red";}
}// 类似的,实现其他颜色,如Blue, Green等...


```

客户端代码示例:

```java

public class BridgePatternDemo {public static void main(String[] args) {Shape circle = new Circle();Shape square = new Square();Color red = new Red();Color blue = new Blue(); // 假设已实现Blue类circle.draw(red);  // 输出: Drawing a Circle filled with color: Redsquare.draw(blue); // 输出: Drawing a Square filled with color: Blue}
}


```

### 桥接模式总结

- **目的**:将抽象和实现解耦,让它们可以独立变化。
- **适用场景**:当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- **优点**:
  - 提高了可扩展性,抽象和实现可以独立扩展,互不影响。
  - 减少了代码的修改量,遵循开闭原则。
- **缺点**:
  - 引入了更多的抽象层次,增加了系统的复杂度。

桥接模式通过将变化的部分抽象出来,实现了抽象与实现的分离,使得两者可以独立演化,从而提高了软件系统的灵活性和可扩展性。

### 桥接模式与其他设计模式对比

#### 与适配器模式的对比

- **目的不同**:

  - **桥接模式**主要解决的是抽象与实现之间的脱耦,让它们可以独立变化。

  - **适配器模式**则是为了将一个接口转换成客户期望的另一个接口,使得原本不兼容的接口可以协同工作。

- **应用场景差异**:

  - 桥接模式常用于系统需要应对多种变化维度,且这些维度需要能够灵活组合的情况。

  - 适配器模式则多用于已有接口不符合新需求,需要做兼容处理的场景。

#### 与装饰者模式的对比

- **关注点不同**:

  - **桥接模式**关注的是类的层次结构,通过抽象和实现的分离,让抽象类和它的派生类可以采用不同的实现方式。

  - **装饰者模式**关注的是动态地给一个对象添加额外的职责,提供一种扩展功能的方式,装饰者和被装饰者通常具有相同的超类型。

- **结构差异**:

  - 桥接模式通过“抽象化”和“实现化”的桥梁来连接,强调的是两个维度的独立变化。

  - 装饰者模式通过层层包装对象来增加行为或责任,每个装饰者都持有对下一个对象的引用,形成一条链。

#### 实际应用中的选择

在实际开发中,选择哪种设计模式取决于具体的需求和场景:

- 如果你的系统需要处理多个维度的变化,并且这些变化应当能够自由组合,那么**桥接模式**可能更适合。

- 如果你需要在不修改原有类的基础上动态地扩展对象的功能,**装饰者模式**将是好选择。

- 当你需要让两个接口不兼容的类能够协同工作时,**适配器模式**能提供解决方案。

每种模式都有其独特的价值,理解它们的核心思想和适用场景,可以帮助我们在设计软件时做出更加合理的选择。

### 设计模式的深入探讨:模式间的组合与模式的高级应用

设计模式不是孤立存在的,在复杂的软件系统设计中,往往需要结合多种设计模式来解决实际问题。下面,我们将探讨几种常见的设计模式组合使用的情况,以及如何通过组合模式解决更复杂的设计挑战。

#### 1. 工厂模式与桥接模式的结合

当系统需要创建多种不同类型的对象,且这些对象又有多种不同的实现方式时,可以结合工厂模式和桥接模式。工厂模式负责创建对象,而桥接模式负责解耦抽象与实现,使得对象的创建和实现方式的变更可以独立进行。

例如,一个文本编辑器应用中,可能需要创建多种类型的文本组件(如按钮、文本框),每种组件又有多种主题风格(如深色、浅色)。这时,可以使用工厂模式来创建各种组件,同时使用桥接模式来分离组件类型与主题风格,实现高度的灵活性和可扩展性。

#### 2. 单例模式与工厂模式的组合

在某些场景下,可能需要确保某些对象的全局唯一性,同时又希望通过工厂模式来管理对象的创建过程。此时,可以在工厂方法内部实现单例逻辑,保证每次请求同一类型的对象时,返回的是同一个实例。

例如,数据库连接池的实现中,通常会使用单例模式确保整个应用程序中只有一个数据库连接池实例,同时利用工厂方法来统一管理数据库连接的获取和释放,这样既保证了资源的有效利用,又保持了代码的整洁和模块化。

#### 3. 策略模式与工厂方法的结合

策略模式用于定义一组算法,将每个算法封装起来,并使它们可以互相替换。结合工厂方法模式,可以根据运行时条件动态选择并创建具体的策略对象,实现算法的动态切换。

在游戏AI设计中,可以根据敌人的类型或游戏难度动态选择不同的攻击策略。工厂方法根据配置或玩家的选择生成相应的策略对象,而策略模式则确保了不同攻击行为的互换性,提高了系统的灵活性和可维护性。

#### 4. 外观模式与装饰者模式的组合

外观模式提供了一个统一的接口,用于访问子系统中的一群接口,简化客户端与子系统的交互。装饰者模式动态地给对象添加一些额外的职责。结合二者,可以在保持接口简洁的同时,灵活地扩展对象功能。

在GUI框架设计中,可以使用外观模式定义一套标准的界面操作API,而装饰者模式则用来动态添加如皮肤、特效等功能,既保证了用户界面的易用性,又提供了丰富的定制能力。

### 结论

设计模式的组合使用能够有效地解决复杂系统设计中的挑战,提高代码的可读性、可维护性和灵活性。理解每种模式的核心思想,并学会根据实际情况灵活组合使用,是每位软件工程师提升设计能力的关键。在实践中不断探索和总结,将有助于深化对设计模式的理解和应用。

相关文章:

java设计模式四 桥接模式

桥接模式关注于将抽象部分与实现部分分离,使它们可以独立变化。它通过在抽象和实现之间建立一个桥梁来实现这一目的。这种设计模式属于结构型模式。 假设我们要设计一个图形编辑器,其中图形(如圆形、正方形)可以有不同的颜色填充…...

《Python编程从入门到实践》day24

# 昨日知识点学习 创建外星人从一个到一行 # 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien Alien(self)alien_width alien.rect.widthavailable_sp…...

【hackmyvm】 Animetronic靶机

靶机测试 arp-scanporturl枚举exiftool套中套passwordsudo 提权 arp-scan arp-scan 检测局域网中活动的主机 192.168.9.203 靶机IP地址port 通过nmap扫描,获取目标主机的端口信息 ┌──(root㉿kali)-[/usr/share/seclists] └─# nmap -sT -sV -O 192.16…...

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!&#xff0…...

RS2255XN功能和参数介绍及PDF资料

RS2255XN是一款由Runic(润石)公司生产的模拟开关。以下是关于RS2255XN的一些技术参数和特点: 封装:MSOP-10 电源电压范围:2.5V至5.5V 工作温度范围:-40C至125C 类型:模拟开关 品牌:R…...

设计模式——外观模式(Facade)

外观模式(Facade Pattern) 是一种结构型设计模式,它为一个子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。这种类型的设计模式属于结构型模式,它向客户端提供了一个接口,隐藏了子系统的…...

【linux软件基础知识】Linux 中的普通进程的调度机制

活动集Active processes和过期集Expired processes 为了实现静态优先级较低的进程没有完全锁定并有机会运行,Linux 调度程序维护两个不相交的可运行进程集:活动集和过期集。 此机制是完全公平调度程序 (CFS) 算法的一部分。 以下是这两组的工作原理: 活动集Active proces…...

keil5软件安装教程(MDKv5.39)

keil5软件安装分为三部分: 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接:链接:https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码:gt3s 1、下载keil5的压缩包并解压,鼠…...

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址:revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场,它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…...

【LAMMPS学习】八、基础知识(5.8)LAMMPS 中热化 Drude 振荡器教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…...

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接(TCP三次握手)---经典面试题3.2断开连接(四次挥手)3.3TCP状态转换 四…...

Java并发编程之锁的艺术:面试与实战指南(三)

Java并发编程之锁的艺术:面试与实战指南(三) 文章目录 Java并发编程之锁的艺术:面试与实战指南(三)前言十七、Java中线程和进程的区别是什么?十八、什么是Java内存模型(JMM&#xff…...

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说,一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件,凭借其卓越的性能和丰富的功能,让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…...

php字符串变量和常见的字符串函数

在 PHP 中,字符串变量用于存储文本数据。你可以使用单引号()、双引号(")或定界符(heredoc 或 nowdoc)来定义字符串。下面是一些关于 PHP 字符串变量的重要点和示例: 1. 单引号…...

PPT基础

5种ppt仅可读形式 Ⅰ 开始选项卡 1.【幻灯片】组中:新建幻灯片,从大纲中导入幻灯片;修改幻灯片的版式;节(新增节,重命名节)。 2.【字体】组中:设置字体,字体大小&…...

初识JDBC

1、JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2、JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface) java.sql.*;(这个包下有很多接口) 接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于…...

React 学习-5

React 条件渲染: 与js中的写法一致 注意:在 JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false。 因此,如果条件是 true,&& 右侧的元素就会被渲…...

深入浅出TCP 与 UDP

🔥 个人主页:空白诗 文章目录 🔥 引言🌐 基础认知概览💻 TCP - 稳健的信使 🛡️🎭 UDP - 敏捷的使者 🏃‍♂️ 🧑‍💻 实战演练:代码示例TCP 服务…...

Leetcode—387. 字符串中的第一个唯一字符【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—387. 字符串中的第一个唯一字符 实现代码 class Solution { public:int firstUniqChar(string s) {int count[26] {0};for(char c: s) {count[c - a];}for(int i 0; i < s.length(); i) {if(count[s[i] - a] 1) {re…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...