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.mzph.cn/web/6984.shtml

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

相关文章

GStreamer日志调试笔记

1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …

国内外主流大模型都具备有哪些特点?

文章目录 ⭐ 火爆全网的大模型起点⭐ 国外主流LLM及其特点⭐ 国内主流LLM及其特点⭐ 全球大模型生态的发展 该章节呢,我们主要是看一下关于国内外主流的大语言模型,通过它们都具备哪些特点,来达成对多模型有一个清晰的认知。对于 “多模型” …

计网作业0429

1.关于现有IPv4分片/重组机制,描述正确的是( ) A.可以在源主机分片 B.可以在中间路由器分片 C.可以在目的主机重组 D.不可以在中间路由器重组 2. 普通路由器转发(非NAT)IP报文过程中,IP报文中哪些字段会…

帮助命令

1.man 原意:manual 所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信息 例:$ man ls 查看ls命令的帮助信息 查看命令的帮助主要是看这个命令是干什么用的&am…

Vue3+.NET6前后端分离式管理后台实战(十七)

1,Vue3.NET6前后端分离式管理后台实战(十七)已经在微信公众号更新,有兴趣的扫码关注一起交流学习。

数据治理:数据孤岛是企业信息化发展中难以避免的阶段

随着信息技术的飞速发展,企业对于数据的依赖程度日益加深。在这个过程中,数据治理成为了企业信息化建设的核心环节。然而,在实际操作中,企业往往会遇到一种难以避免的现象——数据孤岛。 一、数据孤岛的定义与成因 数据孤岛&…

电磁兼容(EMC):产品适用静电放电(ESD)标准全解

目录 1. 标准体系 2. 试验方法标准 3. 常见产品的抗扰度标准 自己研发的产品到底需要满足什么样的静电放电标准要求才是满足国家标准要求。客户提出的静电放电接触放电4kV,空气放电8kV要求,是高于国家标准要求还是低于国家标准要求?面对这…

PyCharm 2024新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境搭建二、PyCharm下载及安装三、解释器配置及项目测试四、PyCharm汉化五、背景图设置 很高兴你打开了这篇博客,如有疑问&#x…

类的流插入与流提取

1.自定义类型不能直接使用流插入与流提取 为什么内置类型可以直接使用流插入与流提取? 其实本质上是人家已经写好了相关的函数,内置类型可以直接调用cout与cin 对于自定义类型,我们需要自己写相关的函数。 2.解决方法 2.1自己在类里面写一个…

微信小程序 【关键部分】

1. 动机 最近在开发小程序,小程序既需兼顾针对新用户的内容预览,又要为注册用户提供服务,简单梳理下,基本需求如下: 小程序共三个tab页,所有用户都可以浏览首页内容,了解我们可以提供的优质服…

Microsoft Remote Desktop Beta for Mac:远程办公桌面连接工具

Microsoft Remote Desktop Beta for Mac不仅是一款远程桌面连接工具,更是开启远程办公新篇章的利器。 它让Mac用户能够轻松访问和操作远程Windows计算机,实现跨平台办公的无缝衔接。无论是在家中、咖啡店还是旅途中,只要有网络连接&#xff0…

鸿蒙UI复用

鸿蒙UI复用 简介BuilderBuilder的使用方式一Builder的使用方式二Builder的使用方式三 Component使用Component复用UI 简介 在页面开发过程中,会遇到有UI相似的结构,如果每个UI都单独声明一份,会产生大量冗余代码,不利于阅读。遇到…

Python头歌合集(题集附解)

目录 一、Python初识-基本语法 第1关:Hello Python! 第2关:我想看世界 第3关:学好Python 第4关:根据圆的半径计算周长和面积 第5关:货币转换 二、turtle简单绘图 第1关:英寸与厘米转换 第2关&#xff1…

鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环境

文章目录 系列文章硬件与软件需求DevEco Studio扩展工具与框架开发资源系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环境 (系列计划预告) 鸿蒙系统UI/UX设计 鸿蒙系统应用开发基础 鸿蒙系统高级开发技术 鸿蒙系统特色功能开发 …

线程池和CountDownLatch搭配使用

一,CountDownLatch CountDownLatch是Java并发编程中用于线程间协调的一个同步辅助类。它通过一个初始计数值来控制线程的等待,这个计数值在其他线程执行特定任务时递减。 初始化:创建CountDownLatch实例时,你需要指定一个整数值&…

vue-cli+vue3+vite+ts 搭建uniapp项目全过程(一)

unapp官方提供了cli 脚手架创建 uni-app 项目的文档 Vue3/Vite版要求 node 版本 18、20使用Vue3/Vite版创建不会提示选择模板,目前只支持创建默认模板 本文以vue3vitets为例 1、初始化项目 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 执行完生成…

037——加入Kconfig机制

目录 一、什么是Kconfig 1.1 由来 1.2 功能 二、 Kconfig的基本语法 2.1 Kconfig 构建项目解析 2.2 怎么调用子makefile做menuconfig 方法一:使用make命令直接调用子目录 方法二:使用变量来指定子目录 方法三:使用include指令包含子…

在RStudio上用Git功能管理Github上的项目

在本教程中,你将学习以下内容: 1. 创建一个新的仓库。 2. 使用 Git 和 RStudio 在本地机器上使用你的仓库。 3. 使用 GitHub.com 网站或 GitHub Enterprise 完成 GitHub 工作流程。 4. 使用 GitHub Pages 发布和共享你的 R Markdown 文档。 先决条件&a…

Java openrasp记录-02

主要分析以下四个部分: 1.openrasp agent 这里主要进行插桩的定义,其pom.xml中定义了能够当类重新load时重定义以及重新转换 这里定义了两种插桩方式对应之前安装时的独立web的jar的attach或者修改启动脚本添加rasp的jar的方式 其中init操作则需要将ras…

大数据技术主要学什么,有哪些课程

大数据技术是指在海量数据的环境下,采集、存储、处理、分析和管理数据的一系列技术与方法。随着互联网、物联网以及各种智能设备的普及,数据量呈爆炸性增长,传统数据处理手段已难以应对,因此大数据技术应运而生,旨在从…