Java二十三种设计模式-桥接模式(10/23)

桥接模式:解耦抽象与实现的灵活设计

引言

桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:桥接模式概述

1.1 定义与用途

桥接模式的基本定义

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心思想是将类的抽象部分与它的实现部分分离,使它们可以独立地变化。这种模式允许系统在不修改原有抽象层代码的情况下,通过更换实现层来扩展系统的功能。

解释为何需要桥接模式

  • 解耦抽象与实现:在软件开发中,经常会遇到抽象和实现紧密耦合的情况,这限制了系统的灵活性和可扩展性。桥接模式通过将它们分离,提高了系统的灵活性。
  • 扩展系统功能:使用桥接模式,可以在不修改原有抽象类代码的情况下,通过增加新的实现类来扩展系统的功能。
  • 避免多重继承:在不支持多重继承的语言中,桥接模式提供了一种替代方案,允许一个类同时具备多个接口的特征。

1.2 桥接模式的组成

抽象化(Abstraction)

  • 定义:定义了抽象类的接口,规定了可以关联的具体实现化角色。
  • 角色:作为桥接模式的基础,抽象化角色将业务逻辑与实现细节分离。

抽象化实现(Refined Abstraction)

  • 定义:扩展抽象化角色,添加了对具体实现化对象的引用,并实现更具体的业务逻辑。
  • 角色:具体抽象化角色提供了与抽象化角色一致或更丰富的接口,并委托具体实现化角色来完成某些操作。

实现化(Implementor)

  • 定义:定义了实现化角色的接口,它规定了实现化对象必须实现的接口。
  • 角色:实现化角色是桥接模式中的具体实现部分,它独立于抽象化角色变化。

具体实现化(Concrete Implementor)

  • 定义:实现了实现化角色的接口,提供了具体的实现细节。
  • 角色:具体实现化角色是实现化角色的具体实现,它定义了实现化接口的具体行为。

客户端(Client)

  • 角色:使用抽象化角色来完成业务逻辑,并通过抽象化角色与实现化角色交互。

桥接模式通过这种角色分离,使得抽象部分和实现部分可以独立地变化,从而提高了系统的灵活性和可扩展性。在下一部分中,我们将通过Java代码示例来展示桥接模式的具体实现。

第二部分:桥接模式的实现

2.1 Java实现示例

以下是使用Java语言实现桥接模式的代码示例。假设我们有一个图形接口,它有不同的实现方式,如圆形和矩形,并且每种图形都有多种绘制方式,如实线和虚线。

// 实现化接口
interface DrawingAPI {void draw();
}// 具体实现化:实线图形
class SolidDrawingAPI implements DrawingAPI {@Overridepublic void draw() {System.out.println("Drawing with solid lines.");}
}// 具体实现化:虚线图形
class DashedDrawingAPI implements DrawingAPI {@Overridepublic void draw() {System.out.println("Drawing with dashed lines.");}
}// 抽象化角色
abstract class Shape {protected DrawingAPI drawingAPI;public Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}abstract void draw();
}// 具体抽象化:圆形
class Circle extends Shape {private float radius;public Circle(DrawingAPI drawingAPI, float radius) {super(drawingAPI);this.radius = radius;}@Overridevoid draw() {drawingAPI.draw();System.out.println("Drawing a circle with radius " + radius);}
}// 具体抽象化:矩形
class Rectangle extends Shape {private float width;private float height;public Rectangle(DrawingAPI drawingAPI, float width, float height) {super(drawingAPI);this.width = width;this.height = height;}@Overridevoid draw() {drawingAPI.draw();System.out.println("Drawing a rectangle with width " + width + " and height " + height);}
}// 客户端代码
public class Client {public static void main(String[] args) {DrawingAPI solidAPI = new SolidDrawingAPI();DrawingAPI dashedAPI = new DashedDrawingAPI();Shape circle = new Circle(solidAPI, 5.0f);circle.draw();Shape rectangle = new Rectangle(dashedAPI, 4.0f, 6.0f);rectangle.draw();}
}

2.2 桥接模式中的角色和职责

抽象化(Abstraction)

  • 职责:定义了与实现化角色之间的接口,不涉及具体的实现细节。

抽象化实现(Refined Abstraction)

  • 职责:扩展抽象化角色,实现更具体的业务逻辑,并使用实现化角色来完成某些操作。

实现化(Implementor)

  • 职责:定义了实现化角色的接口,提供了一个或多个方法供抽象化角色调用。

具体实现化(Concrete Implementor)

  • 职责:实现了实现化接口的具体类,提供了实现化接口的具体实现。

相互作用

  • 抽象化与实现化:抽象化角色通过组合实现化角色来实现自己的部分行为。
  • 具体抽象化与具体实现化:具体抽象化角色通过组合具体实现化角色来完成具体的行为。

桥接模式通过将抽象部分与实现部分分离,允许它们独立地扩展和变化。这种模式提高了系统的灵活性和可扩展性,使得在不修改原有代码的情况下,可以通过增加新的实现类来扩展系统的功能。在下一部分中,我们将探讨桥接模式的使用场景。

第三部分:桥接模式的使用场景

3.1 系统需要独立变化的两个维度

在软件设计中,经常会遇到需要从两个或多个维度进行扩展的情况。例如,一个图形界面库可能需要支持不同类型的图形(如圆形、矩形等)以及不同的绘制样式(如实线、虚线等)。每个维度都可能独立变化,增加新的图形类型或绘制样式。

桥接模式的应用:

  • 独立变化:桥接模式允许抽象部分(如图形类型)和实现部分(如绘制样式)独立变化,互不影响。
  • 扩展性:当需要添加新的图形类型或绘制样式时,只需添加相应的具体抽象化角色或具体实现化角色,无需修改现有代码。
  • 灵活性:客户端代码通过抽象化角色与系统交互,不同的抽象化角色可以绑定不同的实现化角色,提供了高度的灵活性。

应用实例:

  • 图形界面库:如上文所述,图形界面库可以通过桥接模式支持不同类型的图形和绘制样式。
  • 软件渲染引擎:渲染引擎可以使用桥接模式,将渲染对象(如3D模型、纹理等)与渲染技术(如光照、着色等)分离。

3.2 避免多重继承

在某些编程语言中,多重继承可能不被支持或不推荐使用,因为它可能导致复杂的继承关系和难以解决的冲突问题。

桥接模式的优势:

  • 避免多重继承:桥接模式提供了一种避免多重继承问题的方法,通过组合而非继承来实现代码复用。
  • 减少继承层次:桥接模式减少了继承层次,使得系统更加扁平化,简化了类之间的关系。
  • 灵活性与安全性:相比于继承,组合提供了更高的灵活性,并且可以更好地控制访问权限和行为。

应用实例:

  • 企业应用架构:在企业应用中,业务逻辑和数据访问层可能需要独立变化。桥接模式可以避免因使用多重继承带来的复杂性。
  • 游戏开发:游戏中的角色(如敌人、主角等)和行为(如移动、攻击等)可以通过桥接模式进行分离,避免使用多重继承。

桥接模式通过将抽象与实现分离,提供了一种灵活且有效的方式来处理系统中独立变化的多个维度,并避免了多重继承可能带来的问题。在下一部分中,我们将讨论桥接模式的优点与缺点。

第四部分:桥接模式的优点与缺点

4.1 优点

提高系统的灵活性

  • 独立变化:桥接模式使得抽象部分和实现部分可以独立变化,互不影响,从而提高了系统的灵活性。

增强可扩展性

  • 扩展实现:当需要增加新的实现时,只需添加具体实现化类而无需修改抽象类,遵循开闭原则。

避免多重继承问题

  • 减少继承:在不支持多重继承的语言中,桥接模式通过使用组合代替继承,避免了多重继承的问题。

简化系统

  • 解耦组件:桥接模式通过解耦系统的不同组件,简化了系统的结构,使得各部分更容易理解和维护。

提升代码复用性

  • 共享实现:相同的实现类可以在不同的抽象类中被复用,提高了代码的复用性。

4.2 缺点

增加系统的复杂性

  • 类的数量:桥接模式可能会增加系统中类的数量,因为每个抽象类都需要对应的实现类。

设计难度

  • 理解难度:对于不熟悉桥接模式的开发者来说,理解这种模式的结构和意图可能有一定难度。

实现复杂性

  • 实现细节:在桥接模式中,实现类的实现细节可能变得复杂,尤其是当多个抽象类需要协调时。

性能考虑

  • 性能开销:在某些情况下,桥接模式可能会引入额外的性能开销,尤其是在需要频繁切换实现时。

过度设计

  • 适用性:如果问题不需要复杂的抽象和实现分离,使用桥接模式可能是一种过度设计。

桥接模式是一种强大的设计模式,它通过将抽象与实现分离,提高了系统的灵活性和可扩展性。然而,它也需要谨慎使用,以避免增加系统的复杂性和设计难度。在实际应用中,根据具体需求和场景选择是否使用桥接模式是非常重要的。在下一部分中,我们将比较桥接模式与其他设计模式,并提供一些最佳实践和建议。

第五部分:桥接模式与其他模式的比较

5.1 与适配器模式的比较

适配器模式

  • 目的:适配器模式主要用于使不兼容的接口能够一起工作,它通常转换一个类的接口以符合另一个接口的需求。
  • 实现:适配器模式通常包含一个包装对象,该对象将请求从客户端转发到被适配者。

桥接模式

  • 目的:桥接模式主要用于将抽象部分与实现部分分离,以便它们可以独立地变化。
  • 实现:桥接模式通过组合关系将实现化角色与抽象化角色解耦,允许独立地扩展抽象和实现。

对比

  • 解耦方式:适配器模式主要用于解决接口不兼容的问题,而桥接模式用于解耦抽象和实现,以便它们可以独立扩展。
  • 使用场景:适配器模式适用于需要将一个类的接口适配到另一个接口的场景,而桥接模式适用于需要独立变化的多个维度。

5.2 与外观模式的对比

外观模式

  • 目的:外观模式提供了一个统一的高层接口,用于访问子系统中的一组接口,它隐藏了子系统内部的复杂性。
  • 实现:外观模式定义了一个类,该类作为客户端与子系统交互的单一入口点。

桥接模式

  • 目的:桥接模式用于将抽象部分与实现部分分离,以便它们可以独立地变化和扩展。
  • 实现:桥接模式通过抽象化和实现化角色的组合,允许抽象和实现独立变化。

对比

  • 简化访问:外观模式主要用于简化客户端对复杂系统的访问,而桥接模式主要用于解耦抽象和实现。
  • 使用场景:外观模式适用于需要简化客户端与复杂子系统交互的场景,而桥接模式适用于需要独立扩展抽象和实现的场景。

桥接模式和外观模式都用于简化系统设计,但它们的关注点和应用场景不同。桥接模式强调抽象与实现的独立性,而外观模式强调简化客户端对复杂系统的访问。在实际应用中,根据具体需求和场景选择合适的设计模式是非常重要的。在下一部分中,我们将提供桥接模式的最佳实践和建议。

第六部分:桥接模式的最佳实践和建议

6.1 最佳实践

保持抽象和实现的独立性

  • 分离关注点:确保抽象层专注于定义业务功能,而实现层专注于具体的操作细节。

明确角色职责

  • 职责划分:清晰地划分抽象化和实现化角色的职责,避免角色之间的职责重叠。

提供灵活的组合

  • 动态绑定:利用组合的灵活性,允许在运行时动态地更换实现化角色。

避免紧密耦合

  • 松散耦合:通过桥接模式减少组件之间的直接依赖,实现松散耦合。

使用组合而非继承

  • 优先使用组合:在可能的情况下,优先使用组合来实现桥接模式,而不是依赖继承。

6.2 避免滥用

避免过度设计

  • 合理应用:仅在系统确实需要独立变化的多个维度时使用桥接模式,避免无谓的过度设计。

避免增加不必要的复杂性

  • 简化设计:如果系统简单,避免引入复杂的桥接模式,以免增加理解成本和维护难度。

避免过度封装

  • 适度封装:在保持实现细节隐藏的同时,确保不会过度封装,导致客户端难以使用。

6.3 替代方案

使用策略模式

  • 定义一系列算法:当需要根据不同的策略动态改变对象行为时,可以使用策略模式。

使用状态模式

  • 管理状态转换:当对象的状态变化涉及复杂的状态转换逻辑时,可以使用状态模式。

使用装饰者模式

  • 动态添加职责:当需要动态地给对象添加额外职责时,可以使用装饰者模式。

使用组合模式

  • 表示部分-整体结构:当需要表示对象的部分-整体层次结构时,可以使用组合模式。

使用依赖注入

  • 管理依赖关系:通过依赖注入来管理对象的依赖关系,而不是通过硬编码的方式。

桥接模式是一种强大的设计模式,可以提高系统的灵活性和可扩展性。然而,合理使用桥接模式并避免其缺点是至关重要的。了解其替代方案可以帮助开发者根据具体需求和场景选择最合适的设计模式。在实际开发中,应根据具体情况灵活运用桥接模式,以达到最佳的设计效果。

结语

桥接模式提供了一种有效的方法来解耦抽象与实现,使得它们可以独立地变化和扩展。通过本文的深入分析,希望读者能够对桥接模式有更全面的理解,并在实际开发中做出合理的设计选择。

 博主还写了其他Java设计模式文章,请各位大佬批评指正:

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23)

Java二十三种设计模式-代理模式(8/23)

Java二十三种设计模式-外观模式(9/23)

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

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

相关文章

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(五)卡尔曼滤波器一:认知卡尔曼滤波器;协方差矩阵与方差;

卡尔曼滤波器 为了研究卡尔曼,我阅读了大量博文。不敢说完全吃透,但是在做一件什么事,可以通过下面这文章来理解,我读了不下五遍。并整理标准重点,添加自己的一些见解。 自动驾驶传感器融合算法 - 自动驾驶汽车中的激…

电脑屏幕录制工具分享5款,附上详细电脑录屏教程(2024全新)

日月更迭,转眼间已经来到了2024年的立秋,在这个数字技术快速发展的时代,电脑录屏技术已经成为了一项不可或缺的技能,无论是用于工作汇报、在线教学、游戏直播还是个人娱乐。那么录屏软件哪个好用呢?接下来,…

Apache Tomcat 7下载、安装、环境变量配置 详细教程

Apache Tomcat 7下载、安装、环境变量配置 详细教程 Apache Tomcat 7下载Apache Tomcat 7 安装Apache Tomcat 7 环境变量配置启动 Apache Tomcat 7测试Tomcat7是否启动成功 Apache Tomcat 7下载 1、下载地址,找到Archives 链接: 官网下载地址 2、找到Tomcat 7&…

二进制分组背包优化

前言&#xff1a;好久没有写分组背包了&#xff0c;写一个二进制优化的背包练练手 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;#define int long long int n,w; const int N (int)1e7; struct node{int value,weight; }sto[N]; int d…

【数据链路层】ARP协议

文章目录 以太网以太网帧对的格式 MAC地址对比MAC地址和IP地址 MTU和MSSARP协议ARP协议的工作原理ARP欺骗 以太网 ”以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输…

nuxt3实战:完整的 nuxt3 + vue3 项目创建与useFetch请求封装

一. 安装 pnpm dlx nuxilatest init <project-name>// ornpx nuxilatest init <project-name>如遇到报错 手动安装&#xff1a; 浏览器访问报错https请求地址&#xff1a; 点击tar(项目初始文件的下载地址)对应地址,下载starter-3.tar.gz 包到本地 本地创建项…

AskYourDatabase v1.1.83 使用人工智能连接您的数据库并与您的数据聊天

AskYourDatabase 是一个创新的 平台 它允许用户直接连接到您的数据库并与您的数据聊天 。这个革命性的工具使用人工智能来提供答案和分析&#xff0c;日常开发中可以用来帮助开发者编写sql脚本&#xff0c;分析数据结构等。支持市面上流行的数据库。后端数据库开发的又一利器&a…

Go语言加Vue3零基础入门全栈班15 gin+gorm+vue3用户管理系统实战录播课 2024年08月04日 课程笔记

预览 登录页面&#xff1a; 首页&#xff1a; 用户列表&#xff1a; 新增用户&#xff1a; 删除用户&#xff1a; 暗黑模式&#xff1a; 概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 01 Golang零基础入门课_20240726_149元02 Golang面向对象…

Open3D 三维重建-Poisson Surface Reconstruction (泊松曲面重建)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.1.1函数代码 2.1.2参数详解 2.1.3名词解释 2.2完整代码 三、实现效果 3.1原始点云 3.2重建后点云 3.3去除低密度点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点…

Linux快速切换/完善内核

看到标题就晓得是为啥而写的吧&#xff0c;没错&#xff0c;它就是记录Linux的内核切换的一些常见问题&#xff0c;尽可能把平时一些经验和真实有效的心得写下来&#xff0c;同时也希望可以给需要切换内核版本的大伙带来方便&#xff0c;感受到"小小内核切换"竟然如此…

某赛通电子文档安全管理系统 CDGAuthoriseTempletService1 SQL注入漏洞复现(XVE-2024-19611)

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

高效的编程学习方法和技巧

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

关于区块链的公共医疗应用开发

区块链的养老保险平台应用开发 任务一:环境准备 1.编译区块链网络 目录:/root/xuperchain/ 在区块链网络目录下执行make命令,编译网络,编译成功后输出compile done! 启动区块链网络 2.创建钱包账户 创建普通钱包账户userTest,命令如下 bin/xchain-cli account newke…

【linux|001】Unix和Linux的关系 及 它们的发展历史

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

win7系统postman11.7错误:无法定位程序输入点DiscardVirtualMemory于动态链接库KERNEL32.dlI 上

目录 前言&#xff1a;环境描述 一、问题描述 二、问题定位 三、解决方案 1、卸载最新版&#xff0c;安装原来可用的旧版 2、postman禁止自动更新 四、错误的解决方案 1、重启电脑 2、以为是 KERNEL32.dlI 丢失 3、注册 kernel32.dll 4、使用Windows自带的系统文件检…

PPT免费图片素材网站分享

一、Pixabay 网址&#xff1a;https://pixabay.com/ 图片类型&#xff1a;高清、免费、商用 使用方法&#xff1a;找到想要的图片之后&#xff0c;右键复制之后粘贴到PPT即可使用。同时&#xff0c;点击下载可以找到不同尺寸的PPT素材 二、花瓣网 网址&#xff1a;https://…

mysql事务与索引

1.事务 &#xff08;1&#xff09;提出背景&#xff1a; 在日常开发环境中&#xff0c;有一些场景是需要“一气呵成”完成某一个操作。 eg&#xff1a;银行转账的场景&#xff1a;张三&#xff08;手里有1000&#xff09;现要给李四&#xff08;手里有500&#xff09;转500&…

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中&#xff0c;我们都会接触到流程审批的需要业务&#xff0c;我们以往用的最多就是如下图这种流程编辑引擎插件&#xff1a; 以上截图中的流程工具是不是大家常见的呀&#xff01;感觉很丑拿不出手呀&#xff01;在当前行业内卷及竞争激烈情况下&#xff…

Docker Compse单机编排

一.Docker Compse 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;你可以使用 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;然后使用单个命令创建和启动所有服务。这使得在开发、测试和部署过程中管理多容器应用程…