当前位置: 首页 > news >正文

Java 设计模式之桥接模式

文章目录

  • Java 设计模式之桥接模式
    • 概述
    • UML
    • 代码实现

Java 设计模式之桥接模式

概述

  • 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  • 通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。

UML

在这里插入图片描述

核心思想:

  • 抽象部分:定义高层的控制逻辑。
  • 实现部分:定义底层的具体实现。
  • 桥接:通过组合的方式连接抽象部分和实现部分。

角色:

  • Implementor:实现部分的接口,定义行为。
  • ConcreteImplementor:具体实现部分类,实现行为。
  • Abstraction:抽象部分的抽象类,持有实现部分的引用。
  • RefinedAbstraction:具体抽象部分类,实现具体的抽象逻辑。

例如:图形绘制中的形状和颜色。

代码实现

假设我们需要绘制不同形状(如圆形、矩形)的图形,并且这些图形可以使用不同的颜色(如红色、绿色)。使用桥接模式可以将形状和颜色分离,使它们可以独立扩展。

定义部分实现的接口:

public interface Color {void applyColor();
}

定义具体的部分实现类:

public class Red implements Color {@Overridepublic void applyColor() {System.out.println("使用红色");}
}
public class Green implements Color {@Overridepublic void applyColor() {System.out.println("使用绿色");}
}

定义抽象实现的抽象类:

public abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}public abstract void draw();
}

定义具体的抽象实现类:

public class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("绘制矩形");color.applyColor();}
}
public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("绘制圆形");color.applyColor();}
}

使用:

public class Client {public static void main(String[] args) {Red red = new Red();Green green = new Green();Shape redCircle = new Circle(red);Shape greenCircle = new Circle(green);redCircle.draw();greenCircle.draw();}
}

输出:

绘制圆形
使用红色
绘制圆形
使用绿色

相关文章:

Java 设计模式之桥接模式

文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。 UML 核心…...

机器学习(李宏毅)——GAN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 不得不说GAN真是博大精深! 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...

QT无弹窗运行和只允许运行一个exe

最近做一个小功能&#xff0c;需要后台运行QT程序&#xff0c;无弹窗&#xff0c;并且只允许一个exe运行&#xff0c;不关闭程序&#xff0c;无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…...

C++ STL 容器

C 的 STL&#xff08;Standard Template Library&#xff09; 提供了多种容器&#xff0c;分为以下几类&#xff1a; 序列容器&#xff08;Sequence Containers&#xff09;关联容器&#xff08;Associative Containers&#xff09;无序关联容器&#xff08;Unordered Associa…...

开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码

工业物联网的机遇与挑战&#xff1a;为什么企业需要Odoo&#xff1f; 《中国智能制造发展研究报告2023》指出&#xff0c;85%的制造企业已启动数字化转型&#xff0c;但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备&#xff0c;而定…...

CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display

核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...

K8s组件

一、Kubernetes 集群架构组件 K8S 是属于主从设备模型&#xff08;Master-Slave 架构&#xff09;&#xff0c;即有 Master 节点负责集群的调度、管理和运维&#xff0c;Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点&#xff0c;master节点上有 apis…...

python面试题

以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...

AOS安装及操作演示

文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...

蓝桥杯单片机组第十三届初赛试题-程序题(第2批)

题目到官网看即可&#xff0c;有点久了有些细节记不清了&#xff0c;可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的&#xff0c;像代码结构什么的肯定有可以提升的地方&#xff0c;多多包涵&#xff0c;将就看一下。 i2c文件使用官方的&#xff0c;pcf8591函数…...

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...

Python Pandas(11):Pandas 数据可视化

数据可视化是数据分析中的重要环节&#xff0c;它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式&#xff0c;数据可视化将复杂的数字和统计信息转化为易于理解的图像&#xff0c;从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...

【练习】图论

F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...

【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比

什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库&#xff0c;高维向量是特征或属性的数学表示。每个向量都有一定数量的维度&#xff0c;根据数据的复杂性和粒度&#xff0c;可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…...

今日AI和商界事件(2025-02-14)

今日AI大事件主要包括以下几个方面&#xff1a; 一、苹果新品预告 事件概述&#xff1a;苹果CEO蒂姆库克在社交媒体发布7秒视频&#xff0c;配文“准备好迎接家庭的新成员”&#xff0c;并宣布2月19日将有新品发布。知名科技记者马克古尔曼称&#xff0c;新款低端iPhone SE将…...

【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用

ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

spring6(完结)

像是八大模式这种&#xff0c;放在后面八股文中再重点了解&#xff0c;对于源码部分也是后面会一起手敲。 个人觉得spring的重点在于注解开发&#xff0c;省去了很多耦合的问题&#xff0c;像是各种事务的管理&#xff0c;和bean类的管理都可以给spring容器管理&#xff0c;注入…...

Kubernetes (k8s) 常用指令速查表

以下是一份 Kubernetes (k8s) 常用指令速查表&#xff0c;涵盖集群管理、资源操作、故障排查等场景&#xff0c;适合日常运维和开发使用&#xff1a; 1. 集群与节点管理 命令说明kubectl cluster-info查看集群基本信息kubectl get nodes查看所有节点状态kubectl describe node…...

DeepSeek教unity------MessagePack-05

动态反序列化 当调用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 时&#xff0c;二进制数据中存在的任何值都将被转换为基本值&#xff0c;即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…...

Kotlin 优雅的接口实现

1. 日常遇到的冗余的接口方法实现 日常开发中&#xff0c;经常会要实现接口&#xff0c;但是很多场景中&#xff0c;只需要用到其中一两个方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多个接口需要实现&#xff0c;但是很多时候我们只需要用到其中的一…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…...

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…...

7种分类数据编码技术详解:从原理到实战

在数据分析和机器学习领域&#xff0c;分类数据&#xff08;Categorical Data&#xff09;的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型&#xff0c;如性别&#xff08;男/女&#xff09;、颜色&#xff08;红/绿/蓝&#xff09;或产品类…...

Java在word中指定位置插入图片。

Java使用&#xff08;Poi-tl&#xff09; 在word&#xff08;docx&#xff09;中指定位置插入图片 Poi-tl 简介Maven 依赖配置Poi-tl 实现原理与步骤1. 模板标签规范2.完整实现代码3.效果展示 Poi-tl 简介 Poi-tl 是基于 Apache POI 的 Java 开源文档处理库&#xff0c;专注于…...

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后&#xff0c;收到了积极的反馈&#xff0c;同时也包含一些问题。 本次进行一轮小版本更新&#xff0c;发布 v0.4.1 版本&#xff0c;对已知问题进行修复&#xff0c;并对部分功能进行进一步优化。 开源地址&#xff1a;https://github.com/…...

window安装docker\docker-compose

安装前配置 打开控制面板,参照下图打开“启动或关闭windows功能”,Hyper-V 和容器需要启用 程序和功能 启动或关闭windows功能 勾选Hyper-V 安装路径配置 Docker在Windows上的默认安装路径为C:\Program Files\Docker。 以管理员身份运行CMD在D盘,dev文件夹下创建Docker文…...