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

设计模式详解-桥接模式

类型:结构型模式

实现原理:将抽象类和实现类分离,使其独立,然后使用接口再将二者连接起来。

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:类变化频繁时用继承可能会出现的类爆炸问题。

如何解决:减少类的耦合关系,让类独立变化。

应用实例: 汽车制造,抽象部分可以是车辆的基本属性和功能,而实现部分可以是具体型号的引擎,通过桥接模式,我们可以在不同型号的汽车上组合不同类型的引擎

优点: 1、优秀的解耦性 2、优秀的扩展性

缺点:会提高系统的设计与认知难度

使用场景:一个类存在多个独立变化的维度

关键角色

  • 抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
  • 扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
  • 实现(Implementor):定义实现接口,提供基本操作的接口。
  • 具体实现(Concrete Implementor):实现实现接口的具体类。

实现

步骤1:
首先,我们定义了一个接口 DrawAPI,其中包含了绘制圆形的方法 drawCircle。public interface DrawAPI {public void drawCircle(int radius, int x, int y);
}步骤 2:
然后,我们创建了两个实现了 DrawAPI 接口的具体桥接实现类:RedCircleGreenCircle。这两个类分别用于绘制红色和绿色的圆形。public class RedCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: red, radius: "+ radius +", x: " +x+", "+ y +"]");}
}public class GreenCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: green, radius: "+ radius +", x: " +x+", "+ y +"]");}
}步骤 3
我们创建了一个抽象类 Shape,其中包含一个成员变量 drawAPI,它的类型是 DrawAPI 接口。这个抽象类还有一个抽象方法 draw()public abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI){this.drawAPI = drawAPI;}public abstract void draw();
}步骤 4
最后,我们创建了一个实体类 Circle,它继承了 Shape 抽象类。Circle 类有自己的属性(x、y、radius)和一个带有参数的构造函数。在 draw() 方法中,它调用了 drawAPI 的 drawCircle 方法来绘制圆形。public class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}public void draw() {drawAPI.drawCircle(radius,x,y);}
}
步骤 5BridgePatternDemo 类的 main 方法中,我们创建了一个红色的圆形和一个绿色的圆形,并通过调用 draw() 方法来绘制它们。这里的关键点是,我们可以通过传入不同的颜色类(即 RedCircleGreenCircle)来实现不同颜色的圆形绘制,而无需修改 ShapeCircle 类的代码。public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle = new Circle(100,100, 10, new RedCircle());Shape greenCircle = new Circle(100,100, 10, new GreenCircle());redCircle.draw();greenCircle.draw();}
}

综上所述,桥接模式的作用是将抽象部分和实现部分解耦,使它们可以独立地变化。在这个例子中,我们通过桥接模式实现了不同颜色圆形的绘制,而且可以很方便地添加更多的颜色选项,同时保持代码的灵活性和可扩展性。

相关文章:

设计模式详解-桥接模式

类型:结构型模式 实现原理:将抽象类和实现类分离,使其独立,然后使用接口再将二者连接起来。 意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 主要解决:类变化频繁时用继承可能会出…...

设计模式—— 单一职责原则

文章目录 设计模式的目的设计模式原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 设计模式的目的 1,代码重用性(即:相同功能的代码,不用多次编写) 2,可读性(即:编程…...

嵌入式系统中如何选择RTC电池?

RTC(Real Time Clock)是一种用于提供系统时间的独立定时器,它可以在系统断电或低功耗模式下继续运行,只需要一个后备电池作为供电源。在嵌入式系统中,选择合适的RTC电池时非常关键的,它会影响系统时间的准确…...

56 | 国内游戏直播竞品分析

国内游戏直播竞品分析 一、需求分析 当前直播用户群可分为两大类: 主播观众用户需求: 1.主播: 作为直播内容的创造者,主播表现方式和内容很大程度上决定了观众的需求, 其中主播主要只有三点需求: (一) 通过某一手段(如游戏技术、唱歌技巧)获取他人关注,满足虚荣心…...

STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

STM32 CubeMX Freertos STM32 CubeMX (Freertos任务:创建、删除、挂起、恢复) STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基&#xff09…...

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的…...

sqlite3将词典导入数据库

使用sqlite3代码实现将词典导入数据库中 #include <head.h> #include <sqlite3.h> #include <strings.h> #include <unistd.h> int main(int argc, const char *argv[]) {sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE…...

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…...

析构函数中不应该抛出异常(摘录)

析构函数中抛出异常时概括性总结 从语法上面讲&#xff0c;析构函数抛出异常是可以的&#xff0c;C并没有禁止析构函数引发异常&#xff0c;但是C不推荐这一做法&#xff0c;从析构函数中抛出异常是及其危险的。 如果析构函数抛出异常&#xff0c;则异常点之后的程序不会执行&a…...

Windows定时任务计划无法显示任务程序界面的问题解决

笔者这两天写了一个python脚本程序&#xff0c;用来自动从公司的主数据系统获取数据&#xff0c;并按格式编制成excel。脚本程序编写一切顺利&#xff0c;运行结果很是完美&#xff0c;笔者很是舒心。但在最后一步&#xff0c;用上班的电脑每天早上定时运行它时&#xff0c;出了…...

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制&#xff0c;如被限制的IP地址一分钟可以访问10次&#xff0c;而不被限制的IP地址则可以无限访问&#xff1f; ChatGPT 解答 最近ChatGPT爆火&#xff0c;所以也把这个问题让ChatGPT来解答&#x…...

Python学习笔记_进阶篇(二)_django知识(一)

本章简介&#xff1a; Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MVC的软件设计模式&#xff0c;即模型M&#xff0c;视图V和控制器C。它最初是被开发来…...

【hive】hive中row_number() rank() dense_rank()的用法

hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的&#xff0c;通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序&#xff0c;有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …...

【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署

目录 EFK安装部署 一、环境准备&#xff08;所有主机&#xff09; 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …...

计算实数数组中所有元素的绝对值 numpy.fabs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算实数数组中所有元素的绝对值 numpy.fabs() [太阳]选择题 请问关于以下代码表述错误的是&#xff1f; iimport numpy as np a np.array([-1,-3]) b np.array([-1,34j]) print("【显…...

深入浅出Pytorch函数——torch.nn.init.orthogonal_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

ORACLE中UNION、UNION ALL、MINUS、INTERSECT学习

1、UNION和UNION ALL的使用与区别 如果我们需要将两个select语句的结果作为一个整体显示出来&#xff0c;我们就需要用到union或者union all关键字。union的作用是将多个结果合并在一起显示出来。 union和union all的区别是union会自动压缩多个结果集合中的重复结果&#xff…...

【k8s、云原生】基于metrics-server弹性伸缩

第四阶段 时 间&#xff1a;2023年8月18日 参加人&#xff1a;全班人员 内 容&#xff1a; 基于metrics-server弹性伸缩 目录 一、Kubernetes部署方式 &#xff08;一&#xff09;minikube &#xff08;二&#xff09;二进制包 &#xff08;三&#xff09;Kubeadm 二…...

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…...

VSCode快捷键

CtrlShiftP&#xff0c;F1&#xff1a;显示命令面板 CtrlP&#xff1a;快速打开 CtrlShiftN&#xff1a;新窗口/实例 CtrlShiftW&#xff1a;关闭窗口/实例 CtrlX&#xff1a;剪切行 CtrlC&#xff1a;复制行 ALT↑/↓&#xff1a;上下移动 ShiftAlt↓/↑&#xff1a;向…...

3步掌握Beyond Compare 5密钥生成:从原理到实践完整指南

3步掌握Beyond Compare 5密钥生成&#xff1a;从原理到实践完整指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare作为一款功能强大的文件对比工具&#xff0c;其授权验证机制基…...

ModusToolbox实战:如何系统化降低物联网开发复杂性

1. 项目概述&#xff1a;为什么我们需要关注“复杂性”&#xff1f;在物联网&#xff08;IoT&#xff09;领域摸爬滚打十几年&#xff0c;我见过太多项目从雄心勃勃到最终搁浅&#xff0c;其核心症结往往不在于某个高深的技术难题&#xff0c;而在于“复杂性失控”。一个典型的…...

统信UOS系统管理员必看:一招搞定用户配置文件(.config/autostart)的模板化部署

统信UOS系统配置模板化实战&#xff1a;从屏保设置到全局用户环境部署 在大型企业或教育机构的桌面环境管理中&#xff0c;统信UOS作为国产操作系统的代表&#xff0c;其标准化部署能力直接影响运维效率。当我们在模板用户中精心配置了各项参数——从屏幕保护时间到电源管理策略…...

OpenClaw 落地企业微信:AI 驱动办公,效率提升看得见

前言 在企业数字化办公场景下&#xff0c;将智能对话功能与企业微信集成可有效提升内部沟通效率和业务响应速度。本文系统阐述了OpenClaw与企业微信的对接方案&#xff0c;该方案采用可视化操作界面实现智能机器人的快速部署&#xff0c;助力企业便捷构建专属AI助手&#xff0…...

UI-TARS桌面版终极指南:用自然语言控制电脑的免费AI助手

UI-TARS桌面版终极指南&#xff1a;用自然语言控制电脑的免费AI助手 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …...

别再只用EC11调音量了!用STM32做个旋转编码器计数器(OLED显示,附防抖代码)

解锁EC11旋转编码器的计数潜能&#xff1a;STM32实战指南与防抖优化 旋转编码器在电子项目中常被简化为音量调节工具&#xff0c;但其真正的价值远不止于此。EC11作为一款经济高效的旋转编码器&#xff0c;能够提供精确的数字脉冲信号&#xff0c;非常适合需要精准位置控制或速…...

基于Web的Ollama客户端:本地大模型交互的图形化解决方案

1. 项目概述&#xff1a;一个与本地大模型交互的现代客户端 如果你最近在本地部署了像 Llama 3、Mistral 或 Qwen 这类开源大语言模型&#xff0c;大概率会接触到 Ollama 这个工具。它让模型的下载、运行和管理变得异常简单&#xff0c;一条 ollama run llama3 命令就能开启对…...

[A2A协议与实现-01]借助A2A协议打破智能体孤岛

A2A协议是一个开放标准&#xff0c;它实现了Agent之间的无缝通信和协作。它为使用不同框架和由不同供应商构建的Agent提供了一种通用语言&#xff0c;从而促进了互操作性并打破了信息孤岛。A2A协议使得来自不同开发者、基于不同框架构建、并由不同组织拥有的Agent能够联合起来协…...

Windows和Office智能激活终极指南:KMS_VL_ALL_AIO完整使用教程

Windows和Office智能激活终极指南&#xff1a;KMS_VL_ALL_AIO完整使用教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文档突…...

如何快速掌握明日方舟自动化助手:5大核心功能告别重复操作

如何快速掌握明日方舟自动化助手&#xff1a;5大核心功能告别重复操作 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https:/…...