做网站公司郑州郑州的网站建设公司排名/爱站网关键词怎么挖掘

做网站公司郑州郑州的网站建设公司排名,爱站网关键词怎么挖掘,做动图的网站知乎,番禺区网站建设在面向对象设计中,我们经常遇到需要扩展某些功能,但又不能修改现有代码的情况。为了避免继承带来的复杂性和维护难度,桥接模式(Bridge Pattern)应运而生。桥接模式是一种结构型设计模式,旨在解耦抽象部分和…

在面向对象设计中,我们经常遇到需要扩展某些功能,但又不能修改现有代码的情况。为了避免继承带来的复杂性和维护难度,桥接模式(Bridge Pattern)应运而生。桥接模式是一种结构型设计模式,旨在解耦抽象部分和实现部分,使得两者可以独立变化。通过桥接模式,可以避免由于功能扩展而导致的类爆炸问题。

本文将详细介绍桥接模式,讲解其概念、应用场景、优缺点,并通过Java代码示例帮助大家理解如何在实际开发中使用桥接模式。

一、什么是桥接模式?

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分和实现部分分离,使得二者可以独立变化。桥接模式的核心思想是将抽象和实现解耦,让它们可以分别独立地扩展和维护。

桥接模式的定义:

桥接模式通过将抽象层与实现层分离,创建两个独立的层次结构,抽象层和实现层分别独立发展。抽象类仅持有一个实现类的引用,调用实现类的功能,避免了多层继承结构的复杂性。

桥接模式的结构:

  1. 抽象类(Abstraction):定义抽象部分的接口或抽象类,持有一个实现部分的引用。抽象类通过调用实现类的方法来完成工作。
  2. 扩展抽象类(RefinedAbstraction):是对抽象类的具体实现,对外提供更具特定业务需求的接口。
  3. 实现接口(Implementor):定义实现部分的接口,它不一定需要与抽象类的接口完全一致。
  4. 具体实现类(ConcreteImplementor):具体的实现类,负责完成实际的工作。

二、桥接模式的工作原理

桥接模式的工作原理可以通过以下几个步骤来描述:

  1. 抽象类(Abstraction):定义客户端所需要的抽象功能,通常将实现类的引用保存在抽象类中。
  2. 实现类(Implementor):实现具体的功能,它负责完成具体的操作,抽象类通过它来执行任务。
  3. 扩展抽象类(RefinedAbstraction):扩展抽象类并提供更多特定的功能,客户端通过这个类来操作抽象接口。
  4. 客户端(Client):客户端可以通过扩展抽象类来调用实现类的功能,而不需要直接接触实现部分。

通过这种方式,桥接模式使得抽象和实现可以独立变化和扩展,从而避免了继承带来的问题。

三、桥接模式的应用场景

桥接模式适用于以下场景:

  1. 当类的抽象和实现部分可以独立扩展时
    • 当系统的抽象部分和实现部分都有可能发生变化时,桥接模式提供了一种优雅的解决方案,通过桥接将二者解耦,从而避免继承造成的类层次膨胀。
  2. 需要避免类爆炸的场景
    • 如果系统中有多层次的继承体系,可能会因为不同的组合方式导致类的数量迅速增加,桥接模式通过将抽象和实现分开,可以减少类的数目。
  3. 需要在多个平台之间共享代码时
    • 桥接模式可以帮助构建跨平台的系统,例如图形界面的渲染,抽象部分表示用户界面,而实现部分可能是Windows或Linux等平台特定的渲染实现。

四、桥接模式的优缺点

优点:

  1. 解耦抽象与实现
    • 通过桥接模式,抽象部分和实现部分可以独立扩展,避免了大量的继承层次结构,使得系统更加灵活、可维护。
  2. 提高了系统的可扩展性
    • 通过独立的扩展抽象和实现层次,可以方便地为系统添加新的抽象或实现,而不影响现有的功能。
  3. 减少了子类的数量
    • 与多层继承结构相比,桥接模式通过组合关系来避免类的数量膨胀,从而减少了类的数量。

缺点:

  1. 设计复杂性增加
    • 引入了桥接模式会增加系统的复杂性,尤其是在简单的场景中,使用桥接模式可能会导致不必要的类的增加。
  2. 结构较复杂
    • 虽然桥接模式减少了继承层次,但其自身的结构较为复杂,客户端需要理解抽象类和实现类的分离,可能导致代码的理解和维护成本增加。

五、Java中的桥接模式实现

我们通过一个实际的例子来演示如何使用桥接模式。在这个例子中,我们将构建一个图形绘制系统,支持不同的图形(例如圆形、方形),以及不同的绘制颜色(例如红色、绿色)。我们使用桥接模式来将图形和颜色分离,确保两者可以独立变化。

1. 定义实现类接口

// 实现类接口,定义绘制图形的方法
interface DrawAPI {void drawCircle(int radius, int x, int y);void drawRectangle(int length, int width, int x, int y);
}

2. 创建具体实现类

// 红色绘制实现
class RedDrawAPI implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle [color: Red, radius: " + radius + ", position: (" + x + "," + y + ")]");}@Overridepublic void drawRectangle(int length, int width, int x, int y) {System.out.println("Drawing Rectangle [color: Red, length: " + length + ", width: " + width + ", position: (" + x + "," + y + ")]");}
}// 绿色绘制实现
class GreenDrawAPI implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle [color: Green, radius: " + radius + ", position: (" + x + "," + y + ")]");}@Overridepublic void drawRectangle(int length, int width, int x, int y) {System.out.println("Drawing Rectangle [color: Green, length: " + length + ", width: " + width + ", position: (" + x + "," + y + ")]");}
}

3. 定义抽象类

// 抽象类,图形类
abstract class Shape {protected DrawAPI drawAPI;// 构造方法注入实现类protected Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}// 抽象方法,交由子类实现public abstract void draw();
}

4. 创建扩展抽象类

// 具体的形状类:圆形
class Circle extends Shape {private int radius;private int x;private int y;public Circle(int radius, int x, int y, DrawAPI drawAPI) {super(drawAPI);this.radius = radius;this.x = x;this.y = y;}@Overridepublic void draw() {drawAPI.drawCircle(radius, x, y);}
}// 具体的形状类:矩形
class Rectangle extends Shape {private int length;private int width;private int x;private int y;public Rectangle(int length, int width, int x, int y, DrawAPI drawAPI) {super(drawAPI);this.length = length;this.width = width;this.x = x;this.y = y;}@Overridepublic void draw() {drawAPI.drawRectangle(length, width, x, y);}
}

5. 客户端使用桥接模式

public class BridgePatternDemo {public static void main(String[] args) {// 创建具体的实现类对象DrawAPI redDrawAPI = new RedDrawAPI();DrawAPI greenDrawAPI = new GreenDrawAPI();// 创建具体的形状对象Shape redCircle = new Circle(10, 20, 30, redDrawAPI);Shape greenRectangle = new Rectangle(15, 25, 35, 45, greenDrawAPI);// 绘制图形redCircle.draw();greenRectangle.draw();}
}

输出结果:

Drawing Circle [color: Red, radius: 10, position: (20,30)]
Drawing Rectangle [color: Green, length: 15, width: 25, position: (35,45)]

解释:

  1. 实现类(DrawAPI):定义了drawCircledrawRectangle方法,具体的绘制功能由不同的颜色类(如RedDrawAPIGreenDrawAPI)实现。
  2. 抽象类(Shape):定义了一个抽象方法draw,具体的绘制操作由子类(CircleRectangle)实现。
  3. 扩展抽象类(Circle、Rectangle):分别表示不同的形状,每个形状都持有一个DrawAPI对象,用于调用实际的绘制功能。
  4. 客户端:通过桥接模式,客户端可以灵活地创建不同的形状,并使用不同的颜色进行绘制。

六、总结

桥接模式是一种非常实用的设计模式,尤其适用于那些需要将抽象部分与实现部分解耦的场景。它通过将抽象和实现分离,使得二者可以独立扩展和修改,从而避免了多层次继承带来的复杂性。

桥接模式非常适合那些需要扩展多个维度的系统,特别是那些需要不同接口和不同实现组合的场景。在实际开发中,使用桥接模式可以大大提高系统的可扩展性和维护性。

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

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

相关文章

C# Enumerable类 之 集合操作

总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…

51c自动驾驶~合集54

我自己的原文哦~ https://blog.51cto.com/whaosoft/13517811 #Chameleon 快慢双系统!清华&博世最新:无需训练即可解决复杂道路拓扑 在自动驾驶技术中,车道拓扑提取是实现无地图导航的核心任务之一。它要求系统不仅能检测出车道和交…

Spring Cloud Eureka - 高可用服务注册与发现解决方案

在微服务架构中,服务注册与发现是确保系统动态扩展和高效通信的关键。Eureka 作为 Spring Cloud 生态的核心组件,不仅提供去中心化的服务治理能力,还通过自我保护、健康检查等机制提升系统的稳定性,使其成为微服务架构中的重要支撑…

Unity屏幕适配——立项时设置

项目类型:2D游戏、竖屏、URP 其他类型,部分原理类似。 1、确定设计分辨率:750*1334 为什么是它? 因为它是 iphone8 的尺寸,宽高比适中。 方便后续适配到真机的 “更长屏” 或 “更宽屏” 2、在场景…

深度学习中LayerNorm与RMSNorm对比

LayerNorm不同于BatchNorm,其与batch大小无关,均值和方差 在 每个样本的特征维度 C 内计算, 适用于 变长输入(如 NLP 任务中的 Transformer) 详细的BatchNorm在之前的一篇文章进行了详细的介绍:深度学习中B…

使用WireShark解密https流量

概述 https协议是在http协议的基础上,使用TLS协议对http数据进行了加密,使得网络通信更加安全。一般情况下,使用WireShark抓取的https流量,数据都是加密的,无法直接查看。但是可以通过以下两种方法,解密抓…

Linux命令基础,创建,输入,输出,查看,查询

什么是命令、命令行 命令行:即:Linux终端(Terminal),是一种命令提示符页面。以纯“字符”的形式操作操作系统,可以使用各种字符化命令对操作系统发出操作指令。 命令:即Linux程序。一个命令就…

【笔记】深度学习模型训练的 GPU 内存优化之旅:综述篇

开设此专题,目的一是梳理文献,目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化,所以最初思考的专题名称是“显存突围:深度学习模型训练的 GPU 内存优化之旅”,英文缩写是 “MLSys_GPU_Memory_Opt”。…

Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比

文章目录 1. 核心算法概述1.1 Vue 2 双端比对算法1.2 Vue 3 快速 Diff 算法 2. 算法复杂度分析2.1 时间复杂度对比2.2 空间复杂度对比 3. 核心实现解析3.1 Vue 2 双端比对代码3.2 Vue 3 快速 Diff 代码 4. 性能优化分析4.1 性能测试数据4.2 内存使用对比 5. 使用场景分析5.1 Vu…

神经网络的基本知识

感知机 输入:来自其他 n 个神经元传递过来的输入信号 处理:输入信号通过带权重的连接进行传递, 神经元接受到总输入值将与神经元的阈值进行比较 输出:通过激活函数的处理以得到输出 感知机由两层神经元组成, 输入层接受外界输入信号传递给…

C++相关基础概念之入门讲解(上)

1. 命名空间 C中的命名空间(namespace)是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中,可以避免不同部分的代码中出现相同名称的冲突。在C中,可以使用namespace关键字来定义命名空间。 然后我们在调…

网络协议栈

网络协议栈的位置 用户在应用层的各种请求最终会下达给操作系统,操作系统内除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中&#xf…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器,这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

mysql、oracle、SQLserver之间的区别和优势

MySQL、Oracle和SQL Server都是常见的关系型数据库管理系统(RDBMS),它们在某些方面有一些区别和优势。 MySQL: MySQL是一种开源的RDBMS,由Oracle公司开发和维护。它具有快速、稳定和易于使用的特点。MySQL适用于中小型…

75.HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二)

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二) 一、手势系统架构 .gesture(GestureGroup(GestureMode.Exclusiv…

Qt 控件概述 QWdiget

Qt为我们提供了很多控件,这些控件拿过来就可以使用 目录 QWidget 属性 WindowFrame的影响 QWidget Qt中所有的组件都是继承自QWidget Qt Creator中的右侧可以看到QWidget的各种属性 其中各种属性都可以在Qt文档中找到说明 ​ 属性 enabled:描述该组…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读:适合企业内训的 AI 工具实操培训教程 在当今数字化时代,人工智能(AI)技术迅速发展,深度融入到各个领域,AIGC(人工智能生成内容)更是成…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息,您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南,帮助您完成这一过程: 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户(如果您还没有的话)。在Twi…

【最后203篇系列】015 几种消息队列的思考

背景 队列还是非常重要的中间件,可以帮助我们:提高处理效率、完成更复杂的处理流程 最初,我觉得只要掌握一种消息队列就够了,现在想想挺好笑的。 过去的探索 因为我用python,而rabbitmq比较贴合快速和复杂的数据处…

TensorFlow 与 TensorFlow Lite:核心解析与层应用

1. 引言 TensorFlow 是 Google 开发的开源机器学习框架,支持从数据预处理、模型训练到推理部署的完整生命周期。然而,在嵌入式和移动设备上,原生 TensorFlow 过于庞大,因此 Google 推出了轻量级版本——TensorFlow Lite&#xff…