Java设计模式-桥接模式
简介
桥接模式(Bridge Pattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(Gang of Four)提出,在《设计模式》一书中有详细的介绍。
桥接模式和其他设计模式的区别在于它关注的是如何将抽象和实现分离,从而达到灵活性和可扩展性的目的。与之相比,适配器模式关注的是如何将不兼容的接口转换成可兼容的接口,装饰者模式关注的是如何动态地为对象添加行为,而组合模式则是将对象组合成树形结构,以表示“部分-整体”的层次结构。
实现
假设我们正在构建一个图形用户界面(GUI)框架,我们需要支持多个操作系统和窗口管理器。我们可以使用桥接模式来实现这个功能。我们可以将操作系统和窗口管理器的实现分开,以便它们可以独立地变化。我们可以定义一个抽象的Window类,它有一个实现了WindowImpl接口的实例变量。WindowImpl接口表示窗口管理器的实现。我们可以定义一个操作系统的抽象类,它有一个实现了OsImpl接口的实例变量。OsImpl接口表示操作系统的实现。
下面是一个示例代码:
interface WindowImpl {void draw(int x, int y, int width, int height, String color);
}class LinuxWindowImpl implements WindowImpl {public void draw(int x, int y, int width, int height, String color) {System.out.println("Drawing a Linux window at (" + x + ", " + y + ") with width " + width + ", height " + height + ", and color " + color);}
}class WindowsWindowImpl implements WindowImpl {public void draw(int x, int y, int width, int height, String color) {System.out.println("Drawing a Windows window at (" + x + ", " + y + ") with width " + width + ", height " + height + ", and color " + color);}
}abstract class Window {private WindowImpl impl;public Window(WindowImpl impl) {this.impl = impl;}public void draw(int x, int y, int width, int height, String color) {impl.draw(x, y, width, height, color);}
}abstract class Os {private WindowImpl impl;public Os(WindowImpl impl) {this.impl = impl;}public void drawWindow(int x, int y, int width, int height, String color) {Window window = createWindow(impl);window.draw(x, y, width, height, color);}protected abstract Window createWindow(WindowImpl impl);
}class LinuxOs extends Os {public LinuxOs(WindowImpl impl) {super(impl);}protected Window createWindow(WindowImpl impl) {return new LinuxWindow(impl);}
}class WindowsOs extends Os {public WindowsOs(WindowImpl impl) {super(impl);}protected Window createWindow(WindowImpl impl) {return new WindowsWindow(impl);}
}class LinuxWindow extends Window {public LinuxWindow(WindowImpl impl) {super(impl);}
}class WindowsWindow extends Window {public WindowsWindow(WindowImpl impl) {super(impl);}
}
在这个例子中,WindowImpl接口表示窗口管理器的实现,LinuxWindowImpl和WindowsWindowImpl类分别是Linux和Windows操作系统的窗口管理器的实现。Window抽象类有一个实现了WindowImpl接口的实例变量,并且有一个draw方法,该方法将调用WindowImpl的draw方法。Os抽象类也有一个实现了WindowImpl接口的实例变量,并且有一个drawWindow方法,该方法将创建一个Window对象,并调用draw方法。LinuxOs和WindowsOs类分别是Linux和Windows操作系统的实现,它们都是Os抽象类的子类。它们实现了createWindow方法,并返回一个具体的Window对象。
优缺点
优点:
- 桥接模式可以将抽象部分和实现部分分离,使它们可以独立变化,从而达到灵活性和可扩展性的目的。
- 桥接模式可以让客户端代码仅关注抽象部分,而不必关注实现部分的细节
- 桥接模式可以减少继承的使用,因为继承是一种静态的方式,而桥接模式则是一种动态的方式。
缺点:
- 桥接模式需要增加额外的抽象和实现层次,从而增加系统的复杂度和理解难度。
- 桥接模式需要对系统进行重新设计,从而增加了开发的时间和成本。
运用场景:
桥接模式适用于以下情况:
- 当一个类存在两个独立变化的维度时,可以使用桥接模式来将它们解耦,从而使它们可以独立变化。
- 当一个类需要在运行时切换不同的实现时,可以使用桥接模式来实现这一需求。
- 当一个类的抽象和实现部分可以分别扩展时,可以使用桥接模式来实现这一需求。
总结
总的来说,桥接模式是一种结构性设计模式,它可以将抽象部分和实现部分解耦,从而使它们可以独立变化而不会互相影响。Java作为一门面向对象的编程语言,非常适合使用桥接模式来实现复杂的软件系统。
相关文章:
Java设计模式-桥接模式
简介 桥接模式(Bridge Pattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(Gang of Four)提出,在《设计模式》一书中…...

计及N-k安全约束的含光热电站电力系统优化调度模型【IEEE14节点、118节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
欧拉函数详解
文章目录 欧拉函数定义性质计算公式求某个数欧拉函数值线性筛求区域内欧拉函数 欧拉函数 定义 在[1,n]的范围内所有与n互质的数字的个数。 我们用 φ ( n ) \varphi(n) φ(n)来表示数字n的欧拉函数的值,例如: φ ( 4 ) 2 \varphi(4)2 φ(4)2…...

手把手教你如何将安卓手机数据导入iPhone!【详解】
案例:安卓数据导入苹果手机 【大神们,刚换了新的苹果手机,原本的安卓手机数据怎么导入新手机?】 想要换用iPhone,但是又不想丢失安卓手机里的重要数据怎么办?如何将安卓手机数据导入iphone?本文…...

怎么轻松地搞定Win11系统备份任务?
“我是一个电脑小白,不是很懂电脑的一些操作。我刚买了一台新电脑,它装的是Win11系统,我害怕它出现什么问题,听朋友说可以通过备份的方法保护系统,这是真的吗?有谁知道该怎么进行Win11系统备份吗࿱…...

MySQL集群
目录 主从复制 主从复制流程: 为什么要有relay log中继日志? 为什么要有主从复制,好处? 实际生产环境中。如果对MySQL数据库的读写都在一台数据库服务器中操作,无论是再安全性、高可用性,还是高并发性等…...

关于Kerberos认证的一些攻击手法学习总结
Kerberos认证流程 前言 本文主要分享最近学习的关于域内Kerberos认证的一些攻击手法,以自我的理解为主,从原理理解切入到基本工具利用来阐述,个人的理解分析较为啰嗦,嫌太兀长的可以跳着看就好,还请各位谅解。如有错误…...

STL-deque容器
双端数组,可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处,比如: deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque 容器也可…...
❤ go语言和java语言的优缺点
❤ go语言和java语言的优缺点对比 对比GOJAVA介绍Java是一种流行的面向对象的编程语言,它的语法类似于C,并且具有丰富的类库和工具。Java的可移植性很好,可以在多种平台上运行。Go是一种新兴的编程语言,它比Java更加简洁和易学&a…...

安全成就未来|Fortinet Accelerate 2023·中国区巡展首站启幕
Fortinet Accelerate 2023中国区巡展 年度网络安全盛会 Fortinet Accelerate 2023中国区巡展,昨日在深圳拉开帷幕,开启15城巡展的“首城之站”。本年度巡展主题“安全成就未来”,Fortinet与中企通信、亚马逊云科技等生态合作伙伴,…...

输入URL到显示界面的整个过程
以如下这个比较简单的网络拓扑模型作为例子,探究中间发生的整个过程: 1 HTTP 浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息。下图展示了一条长长的URL里各个元素代表什么: 所以整个长长的URL…...
BetaFlight飞控启动运行过程简介
BetaFlight飞控启动&运行过程简介 1. 源由2. 启动过程2.1 main(主程序)2.2 init (初始化)2.3 run 3. 任务调度3.1 任务定义3.2 scheduler (调度器) 4. 总结5. 参考资料6. 附录 -- 问题汇总6.1 Why desiredPeriodCycles is so …...

智能汽车实验二(视觉传感器标定)
实验二 视觉传感器标定(实验报告) 【实验目的】 1、了解开源图像处理库OpenCV的结构,掌握OpenCV的基本使用方法。 2、了解开源图像处理库OpenCV的基本模块功能,掌握常用图像处理方法。 3、掌握摄像机标定算法,学会使用…...
计算机网络:HTTP
目录 HTTP 是什么?HTTP 常见的状态码有哪些HTTP 常见字段有哪些参考资料 HTTP 是什么? HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。 1. 「协议」 「协」字,代表的意思是必须有两个以上的参与者。「议」字&…...
Go 语言接口
Go 语言接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 实例 实例 /* 定义接口 */ type interface_name interface { method_name1 [return_type] method_name2…...
常用的intellij的快捷键
ctrlshiftspace(new 后面自动提示) ctrlshift/ (注释) itar后面tab (for循环) it后面ctrlj(很多智能代码生成) AltInsert(自动生成构造函数,get,set方法) ctrlaltt(自动生成try,catch) altenter(创建测试类和子类) ctrlshiftbackspace(最后编辑的地方) ctrl…...
Unity中的`SetPositionAndRotation()`
介绍 SetPositionAndRotation() 是Unity中的一个方法,用于同时设置物体的位置和旋转。它可以在不必分别调用 transform.position 和 transform.rotation 属性的情况下,直接设置物体的位置和旋转。 方法 以下是 SetPositionAndRotation() 方法的参数&a…...

API 接口的使用和功能
随着互联网的快速发展,API接口已经成为了现代开发中不可或缺的一部分。API接口可以让你的应用程序与其他应用程序、系统或服务进行数据交流和集成。如果你正在开发应用程序,那么最好的方法就是使用API接口来增强功能和性能。 我们的API接口是为您的应用…...
Vue插件
介绍 Vue插件是一种扩展Vue应用程序功能的方式。使用Vue插件,您可以在Vue应用程序中重复使用代码或添加新功能。更具体地说,Vue插件通常具有以下用途: 封装重复的功能或组件,以便在多个Vue组件中使用。 扩展Vue的核心功能并使其…...

C++好难(5):内存管理
这一节学完,我们 C嘎嘎 就算是正式入门了,但是之后的课还会更上一阶d(ŐдŐ๑) 继续坚持! 【本节目标】 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...