java设计模式四 桥接模式

 

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

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

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

```java
public interface Shape {
    void draw(Color color);
}

public interface Color {
    String getColor();
}
```

接着,实现具体的形状和颜色类:

```java
public class Circle implements Shape {
    @Override
    public void draw(Color color) {
        System.out.println("Drawing a Circle filled with color: " + color.getColor());
    }
}

public class Square implements Shape {
    @Override
    public void draw(Color color) {
        System.out.println("Drawing a Square filled with color: " + color.getColor());
    }
}

public class Red implements Color {
    @Override
    public 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: Red
        square.draw(blue); // 输出: Drawing a Square filled with color: Blue
    }
}
```

### 桥接模式总结

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

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

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

 

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

 

- **目的不同**:

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

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

 

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

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

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

 

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

 

- **关注点不同**:

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

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

 

- **结构差异**:

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

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

 

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

 

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

 

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

### 结论

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

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

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

相关文章

win10安装DHCP服务--用于2台机器之间搭建简易网络来进入目标机器修改配置

前言: 客户多了,往往会出现各种突发情况。 比如一个客户现场没有DHCP,没有显示器,键盘。 你只有一台笔记本的情况下要配置目标机器的网络。要如何配置?? 这时候就可以使用这篇博客提供的方式了。 Windows…

Android使用kts发布aar到JitPack仓库

Android使用kts发布aar到JitPack 之前做过sdk开发,需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护,本文是讲解上传到JitPack的方式,使用KTS语法,记录使用过程中遇到的一些坑.相信Groovy的方式是大家经常使用的,…

Codeforces Round 738 (Div. 2) D2. Mocha and Diana (Hard Version)

题目 思路: 性质1:能在结点u,v添加边的充要条件是u,v在第一个图和第二个图都不连通 性质2:可以添加的边数等于 n - 1 - max(m1, m2),并且添加边的顺序不会影响结果(即 边(u&#x…

U.S. Student Information Center——全球学历认证

权威机构 中国留服中心认证,全称是中国教育部留学服务中心国(境)外学历学位认证。国(境)外学历学位认证工作旨在落实中华人民共和国的留学政策,即中国教育部留学服务中心根据归国留学生提出的申请,鉴别国(境)外学历的…

C语言——文件相关操作

2.什么是文件 3.文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 6.文本文件和二进制文件 7.文件读取结束的判定 8.文件缓冲区 一、文件相关介绍 1、为什么使用文件 文件用于永久存储数据。通过使用文件,我们可以在程序关闭后保存数据,以便将来…

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展,快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot,作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台,通过整合微信…

AI-数学-高中56-成对数据统计-线性回归方程

原作者视频:【成对数据统计】【一数辞典】1线性回归方程_哔哩哔哩_bilibili 注意:高中只学线性回归。 最小二乘法(残差和平方最小的直线、方差最小>拟合程度最好):

滑动验证码登陆测试编程示例

一、背景及原理 处理登录时的滑动验证码有两个难点,第一个是找到滑块需要移动的距离,第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法,即路程的前半段加速度为正值,后半段为负值去模…

微搭低代码入门03页面管理

目录 1 创建页面2 页面布局3 页面跳转总结 上一篇我们介绍了应用的基本操作,掌握了应用的概念后接着我们需要掌握页面的常见操作。 1 创建页面 打开应用的编辑器,在顶部导航条点击创建页面图标 在创建页面的时候可以从空白新建,也可以使用模…

docker-本地私有仓库、harbor私有仓库部署与管理

一、本地私有仓库: 1、本地私有仓库简介: docker本地仓库,存放镜像,本地的机器上传和下载,pull/push。 使用私有仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下…

JavaEE >> Spring Boot 日志

日志的作用以及什么是日志 日志就是为了当程序出错的时候,程序员们可以通过日志看到是哪部分出现错误了,为了发现和定位问题。当然,我们还可以通过日志实现一些功能,如下: 记录系统的操作⽇志,⽅便数据恢…

CSS探索之旅:定位

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文我们详细介绍 css中定位的相关知识点 定位的用处 先简单认识一下定位是做什么的。 其实,定位的功能就像他的名字一样,可以规定显示在网页的一个位置。 其他布局的效果 我们之前默认…

Java面试——不安全的集合类

​ 系统性学习&#xff0c;移步IT-BLOG-CN Java 中有许多的集合&#xff0c;常用的有List&#xff0c;Set&#xff0c;Queue&#xff0c;Map。 其中 List&#xff0c;Set&#xff0c;Queue都是Collection&#xff08;集合&#xff09;&#xff0c;List中<>的内容表示其中…

基于Pytorch深度学习——卷积神经网络(卷积层/池化层/多输入多输出通道/填充和步幅/)

本文章来源于对李沐动手深度学习代码以及原理的理解&#xff0c;并且由于李沐老师的代码能力很强&#xff0c;以及视频中讲解代码的部分较少&#xff0c;所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉&#xff0c;所以我们会采用逐行解释小…

Java 笔记 15:Java 数组相关内容补充,多维数组,Arrays 类的常见用法,以及冒泡排序

一、前言 记录时间 [2024-05-05] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 Java 笔记 …

【在线OJ】Vue在线OJ项目

一、主页 二、题库 三、在线编译器 四、比赛 五、搜索 六、个人主页

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中&#xff0c;很常见的效果&#xff0c;就是容器中的内容缓慢地向下移动&#xff0c;直到底部停止&#xff0c;然后快速滚动回顶部&#xff0c;然后接着缓慢滚动到底部。并且在特定的情况下&#xff0c;还需要进行一些小交互&#xff0c;那就还得让…

RabbitMQ之生产批量发送

为什么要用生产批量发送&#xff1f; 批量发送消息&#xff0c;可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送&#xff1a; ba…

FreeRTOS低功耗模式(1-19)

低功耗模式简介(了解) 很多应用场合对于功耗的要求很严格&#xff0c;比如可穿戴低功耗产品、物联网低功耗产品等 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发 stm32的低…
最新文章