Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)

在这里插入图片描述

码到三十五 : 个人主页

心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !


目录

    • 一、引言
    • 二、什么是桥接设计模式
    • 三、桥接设计模式的核心思想
    • 四、桥接设计模式的角色
    • 五、桥接设计模式的工作流程和实现
      • 实现方式一:使用接口与实现类
      • 实现方式二:使用抽象类与实现类
    • 六、桥接设计模式的优点和适用场景
    • 七、结语

[参见]:

Java设计模式:核心概述(一)

Java设计模式:单例模式之六种实现方式详解(二)

Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)

Java设计模式:建造者模式之经典与流式的三种实现(四)

Java设计模式:适配器模式的三种形式(五)

Java设计模式:深入装饰器模式的三种写法(六)

Java设计模式:组合模式之透明与安全的两种实现(七)

Java设计模式:代理模式的静态和动态之分(八)

Java设计模式:外观模式之优雅门面(九)

一、引言

在软件设计和开发中,我们经常面临的一个挑战是如何在保持代码灵活性和可扩展性的同时,减少代码之间的耦合度。设计模式就是在这样的背景下应运而生的,它们为开发者提供了一种通用的、经过验证的解决方案来应对常见的设计问题。今天,我们要深入探讨的是Java中的桥接设计模式(Bridge Design Pattern)。

二、什么是桥接设计模式

桥接设计模式,如其名,就像是在两个不同结构或概念之间搭建了一座“桥梁”。在软件设计中,这座“桥梁”连接的是抽象部分和实现部分,使得它们能够独立地变化而互不影响。

具体来说,桥接模式允许你将一个大的或复杂的类(或一组类)拆分为两个独立的层次结构:抽象层次结构和实现层次结构。抽象层次结构定义了操作的接口,而实现层次结构则提供了这些操作的具体实现。这两个层次结构之间通过一个引用(或桥梁)进行连接,从而实现了抽象与实现的解耦。

这种解耦的好处是显而易见的。首先,它提高了代码的灵活性。由于抽象和实现是独立的,你可以在不修改抽象部分的情况下更改或替换实现部分,反之亦然。其次,它增强了代码的可扩展性。你可以独立地扩展抽象部分和实现部分,从而创建出更多的组合和变体。

三、桥接设计模式的核心思想

桥接设计模式的核心思想是“组合优于继承”。这一思想强调通过组合(即对象之间的关联关系)来实现代码的复用和扩展,而不是通过继承(即类之间的层级关系)。

在这里插入图片描述

在面向对象编程中,继承是一种强大的代码复用机制。然而,过度使用继承也会导致一些问题,如代码的可读性下降、维护成本增加以及灵活性降低等。特别是当继承层次过深或过于复杂时,这些问题会变得更加明显。

桥接设计模式通过引入一个抽象层(即桥梁)来分离接口和其具体实现,从而避免了继承带来的这些问题。在这个抽象层中,你可以定义一些抽象的操作或方法,这些方法将委托给具体的实现对象来执行。这样,抽象部分和实现部分就可以通过组合关系进行连接,而不是通过继承关系。

这种组合关系带来了几个好处

  • 首先,它减少了代码之间的耦合度。由于抽象部分和实现部分是独立的,你可以在不修改其他部分的情况下更改或替换其中的一部分。

  • 其次,它提高了代码的灵活性和可扩展性。你可以根据需要动态地组合不同的抽象部分和实现部分,从而创建出满足特定需求的新对象或功能。

  • 最后,它使得代码更加清晰和易于维护。通过将抽象和实现分离,你可以更容易地理解和修改代码的各个部分,从而提高了代码的可读性和可维护性。

四、桥接设计模式的角色

在桥接设计模式中,通常涉及以下几个关键角色:
在这里插入图片描述

  1. Abstraction(抽象):定义一个抽象类,它包含一个对实现对象的引用(通常是接口类型)。这个抽象类将定义一些操作,这些操作将委托给具体的实现对象来执行。

  2. RefinedAbstraction(精化抽象):继承自Abstraction,并为核心抽象增加新的功能。这些功能可能会使用也可能不使用实现对象提供的操作。

  3. Implementor(实现者接口):定义实现对象的接口,该接口声明了实现对象需要提供的具体操作。

  4. ConcreteImplementor(具体实现者):实现Implementor接口,提供具体操作的实现。

五、桥接设计模式的工作流程和实现

在桥接设计模式中,抽象与实现之间的交互通常遵循以下步骤:

    1. 客户端创建一个RefinedAbstraction对象,该对象包含一个指向某个ConcreteImplementor对象的引用。
    1. 客户端通过调用RefinedAbstraction对象的方法来执行某些操作。
    1. 在RefinedAbstraction对象中,这些操作被委托给其包含的ConcreteImplementor对象来实际执行。
    1. 如果需要更换具体的实现,只需要改变RefinedAbstraction对象中引用的ConcreteImplementor对象即可,无需修改RefinedAbstraction对象本身的代码。

实现方式一:使用接口与实现类

  1. 定义实现者接口(Implementor)
// 实现者接口定义了操作的契约
interface Implementor {void operationImpl(); // 定义需要实现的操作
}
  1. 定义具体实现者(ConcreteImplementor)
// 具体实现者A实现了实现者接口
class ConcreteImplementorA implements Implementor {@Overridepublic void operationImpl() {System.out.println("具体实现者A的操作实现");}
}// 可以有多个具体实现者,例如B
class ConcreteImplementorB implements Implementor {@Overridepublic void operationImpl() {System.out.println("具体实现者B的操作实现");}
}
  1. 定义抽象类(Abstraction)
// 抽象类持有一个对实现者接口的引用
abstract class Abstraction {protected Implementor implementor;public Abstraction(Implementor implementor) {this.implementor = implementor;}public void operation() {// 调用实现者的操作,可能包括一些抽象类自己的逻辑implementor.operationImpl();}
}
  1. 定义精化抽象类(RefinedAbstraction)
// 精化抽象类继承自抽象类,并可能增加额外的操作
class RefinedAbstraction extends Abstraction {public RefinedAbstraction(Implementor implementor) {super(implementor);}public void refinedOperation() {// 精化操作,可以调用或不调用实现者的操作System.out.println("精化抽象类的额外操作");super.operation(); // 可以选择性地调用父类的操作}
}
  1. 客户端代码
public class BridgePatternClient {public static void main(String[] args) {// 创建具体实现者Implementor implementorA = new ConcreteImplementorA();Implementor implementorB = new ConcreteImplementorB();// 创建精化抽象类对象,并传入不同的实现者Abstraction abstractionA = new RefinedAbstraction(implementorA);Abstraction abstractionB = new RefinedAbstraction(implementorB);// 调用操作abstractionA.operation(); // 输出:具体实现者A的操作实现((RefinedAbstraction) abstractionB).refinedOperation(); // 输出:精化抽象类的额外操作 和 具体实现者B的操作实现}
}

实现方式二:使用抽象类与实现类

在这种方式中,需要将接口Implementor替换为抽象类,其余结构与方式一类似。这种方式提供了更多的灵活性,允许在实现者之间共享一些状态或行为。

// 将Implementor接口改为抽象类,并添加一些共享的状态或行为...
abstract class Implementor {public void sharedOperation() {// 共享的操作实现...}public abstract void operationImpl(); // 仍然是抽象方法,需要具体实现者来实现
}

具体实现者将继承这个抽象类,并提供operationImpl方法的实现。其余的代码结构与方式一保持一致。这种方式的优点是可以在不同的实现者之间共享代码,但缺点是可能引入更多的继承层级。选择哪种方式取决于具体的应用场景和需求。

六、桥接设计模式的优点和适用场景

桥接设计模式的优点主要体现在以下几个方面:

  1. 分离抽象与实现:通过将抽象与实现解耦,使得它们可以独立地演化而不相互影响。

  2. 提高灵活性和可扩展性:可以在运行时动态地更换实现,而无需修改客户端代码。

  3. 减少继承带来的层级结构:避免了使用多层继承来组合功能时可能导致的复杂性和僵化性。

桥接设计模式的适用场景包括但不限于:

  • 当一个系统需要在多种平台上运行时,可以使用桥接模式来将系统本身与平台相关的实现细节分离开来。
  • 当一个系统需要支持多种类型的数据库或文件系统等外部资源时,可以使用桥接模式来抽象出资源的通用接口,并通过具体的实现类来适配不同类型的资源。
  • 在需要实现插件化或模块化的系统中,可以使用桥接模式来定义统一的接口标准,并允许第三方开发者提供具体的实现插件或模块。

七、结语

桥接设计模式是一种非常强大且灵活的设计模式,它通过引入一个抽象层来分离接口和其具体实现,从而降低了代码之间的耦合度并提高了代码的灵活性和可扩展性。在实际的项目开发中,我们可以根据具体的需求场景来选择是否应用桥接设计模式以及如何合理地运用它来优化我们的代码结构。



感谢 关注公众号 码到三十五 ,共享更多技术资料。


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

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

相关文章

【JAVASE】带你了解instanceof和equals的魅力

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.instanceof instanceof 是 Java 的保留关键字。它的作用是测试…

MySQL复制拓扑1

文章目录 主要内容一.安装MySQL服务器1.MySQL 安装程序和其它文件保存在下发的 mysql8-files.iso 镜像文件中,可以使用虚拟光驱来提取到 Linux 文件系统。代码如下(示例): 2.将 MySQL8.0 程序解压到 /opt 目录,再创建到 MySQL 默认…

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…

自然语言处理NLP概述

大家好,自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向,其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将从自然语言处理的本质、原理和应用三个方面,对其进行概述。 一、NLP的本质 NLP是一种…

【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入: head [1,2,3,4,5], n 2 输出: [1,2,3,5]示例 2: 输入: head [1], n 1 输出: []示例…

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里…

一种遥感影像多类变化检测方法

多任务学习孪生网络的遥感影像多类变化检测 马惠1, 刘波2, 杜世宏2 1.河南省国土空间调查规划院,郑州 450016 2.北京大学遥感与地理信息系统研究所,北京 100871 摘要: 精确掌握土地覆盖/利用的变化及变化类型对国土空间规划、生态环境监测、灾害评估等有着重要意义,然而现有…

【Unity每日一记】如何让Sprite精灵图集的背景图层变成透明,方便切割

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

微信小程序上传到gitee

共三步 1、新建gitee仓库 点号,新建仓库,填入仓库信息新建即可 2、修改版本管理参数 微信开发者工具中点开版本管理,未初始化,需要先点初始化 接下来将设置中的通用、网络认证、远程3个部分的参数填写好 通用:核对…

前端零基础学习web3开发

目录 1 钱包 2 发起交易 3 出块 4 块高 5 矿工 6 Gas费 这一节,我们不说让人神往的比特币,不说自己会不会利用这个虚拟的货币来发财,也不说那些模模糊糊的知识,什么去中心化啦,什么奇妙的加密啦,我们…

论文笔记:Detecting Pretraining Data from Large Language Models

iclr 2024 reviewer评分 5688 1 intro 论文考虑的问题:给定一段文本和对一个黑盒语言模型的访问权限,在不知道其预训练数据的情况下,能否判断该模型是否在这段文本上进行了预训练 这个问题是成员推断攻击(Membership Inference Attacks&…

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3 前情回顾: 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 1.8.3 卷积神经网络近年来…

Python小白入门教程:手把手教你安装最新版本Anaconda及运行第一个程序

1、Anaconda是什么? 其实通过百度搜索就能了解到,再次可以看下它自己官网的介绍:如下 简单的说,它就是一个集成的管理软件,管理很多工具包 2、为什么安装Anaconda? 简单的说,就是为了方便&am…

Open3D (C++) 计算点云的特征值特征向量

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 针对整个点云 P = { p i } i

面试算法-139-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。…

科技云报道:卷完参数卷应用,大模型落地有眉目了?

科技云报道原创。 国内大模型战场的比拼正在进入新的阶段。 随着产业界对模型落地的态度逐渐回归理性,企业客户的认知从原来的“觉得大模型什么都能做”的阶段,已经收敛到“大模型能够给自身业务带来什么价值上了”。 2023 年下半年,不少企…

mac老版本如何升级到最新版本

mac老版本如何升级到最新版本 老macbook升级新版本(Big sur、Monterey) 首先介绍我的电脑的机型及情况: 2015年初的MacBook Air 处理器是1.6Hz 双核Interl Core i5 内存4G 老版本只能升到10.13 想要升到最高版本的原因:想要注册…

JVM 组成

文章目录 概要JVM 是 Java程序的运行环境(java二进制字节码的运行环境)JVM 的主要组成部分运行流程:程序计数器堆元空间方法区常量池运行时常量池 概要 JVM 是 Java程序的运行环境(java二进制字节码的运行环境) 好处&…

【排列回溯】Leetcode 46. 全排列 47. 全排列 II

【排列回溯】Leetcode 46. 全排列 47. 全排列 II 46 全排列——used数组上下层保证不取重复的即可47. 全排列 II——used去重上下层,再去重本层重复元素 46 全排列——used数组上下层保证不取重复的即可 ---------------🎈🎈题目链接&#x…