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

六、桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象与实现分离,使得两者可以独立变化。通过使用桥接模式,可以避免在多个维度上进行继承,降低代码的复杂度,从而提高系统的可扩展性。

组成部分

  1. 抽象类(Abstraction): 定义高层的抽象接口,并持有对实现的引用。
  2. 扩展抽象类(RefinedAbstraction): 继承自抽象类,提供具体的扩展实现。
  3. 实现接口(Implementor): 定义实现部分的接口。
  4. 具体实现类(ConcreteImplementor): 实现实现接口的具体类。

JAVA: 

// 1、定义一个图像接口
public interface Graph {//画图方法 参数:半径 长 宽public void drawGraph(int radius, int x, int y);
}
// 红色图形
public class RedGraph implements Graph{@Overridepublic void drawGraph(int radius, int x, int y) {System.out.println("红色");}
}
// 创建一个形状
public abstract class Shape {public Graph graph;public Shape(Graph graph){this.graph = graph;}public abstract void draw();
}
// 圆形
public class Circle extends Shape{private int radius;private int x;private int y;public Circle(int radius, int x, int y, Graph graph) {super(graph);this.radius = radius;this.x = x;this.y = y;}@Overridepublic void draw() {System.out.println("圆形");graph.drawGraph(radius, x, y);}
}
@Test(description = "桥接模式")public void bridgePatternTest(){//创建圆形Shape shape = new Circle(10, 100, 100, new RedGraph());shape.draw();}

 GO:

package bridgeimport "fmt"// 桥接模式// IMsgSender 消息发送接口
type IMsgSender interface {// Send 发送动作函数Send(msg string) error
}// EmailMsgSender发送邮件
// 可能还有 电话、短信等各种实现
type IMsgReceiver struct {emails []string
}func (I IMsgReceiver) Send(msg string) error {// 这里去发送消息fmt.Println(msg, "消息发送成功")return nil
}func NewEmailMsgSender(emails []string) *IMsgReceiver {return &IMsgReceiver{emails: emails}
}// INotification 通知接口
type INotification interface {// Notify 通报函数Notify(msg string) error
}// ErrorNotification 错误通知
// 后面可能还有 warning 各种级别
type ErrorNotification struct {sender IMsgSender
}// Notify 发送通知
func (e ErrorNotification) Notify(msg string) error {return e.sender.Send(msg)
}func NewErrorNotification(sender IMsgSender) *ErrorNotification {return &ErrorNotification{sender: sender}
}
func TestBridge(t *testing.T) {sender := NewEmailMsgSender([]string{"test@test.com"})n := NewErrorNotification(sender)err := n.Notify("test msg")assert.Nil(t, err)
}

相关文章:

六、桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象与实现分离,使得两者可以独立变化。通过使用桥接模式,可以避免在多个维度上进行继承,降低代码的复杂度,从而提高系统的可扩展性。 组成…...

Vue eslint 语法检测问题

1. 修改 prettier 配置文件 确保你的项目中有 .prettierrc 配置文件,并在其中添加或修改 endOfLine 设置为 lf,确保统一使用 LF 换行符。 在 .prettierrc 文件中添加: {"endOfLine": "lf" }2. 修改 .editorconfig 文件…...

QT Creater实现国庆节主题项目【0基础完成版】

本文适用对象 想要学习qt creater的小白;想要学习c++制作软件的编程爱好者。可以先下载这篇博客绑定的资源,然后一边操作,一边学习,会更高效~0. 创建初始项目 一步步来操作吧,首先下载qt creter,之前发布过相关资源,大家直接查找下载,或者自行下载。 1. 初始代码 mai…...

Qt 加载 WPS 时提示要登录

项目中Qt加载word时 默认用wps打开word文档 程序一运行老是提示要立即登录 看着很烦 可以按下面的方法去掉这个烦人的东西 在下面的项目中新建字符串enableforceloginforfirstinstalldevice,值为false即可。...

vue3的el-tree的default-checked-keys无法勾选的问题解决

前言:有些树形控件是需要默认勾选的 但是请求后渲染不显示 刷新外部的key值也没有用 看了一下文档 我们使用自带的方法来解决 <el-treenode-key"id":data"state.parentMenuList":default-checked-keys"state.checkIdList":check-on-click-n…...

class 5: vue.js 3 v-model和表单输入

v-model是Vue.js 3中用于实现双向绑定的重要指令&#xff0c;双向绑定就是对于数据的修改会映射回UI组件上&#xff0c;同时对于UI组件上数据的变更也会映射回底层数据当中&#xff0c;v-model会根据控件的类型自动选取正确的方法来更新元素v-model底层实现的原理实际上是v-bin…...

了解一下HTTP 与 HTTPS 的区别

介绍&#xff1a; HTTP是超文本传输协议。规定了客户端&#xff08;通常是浏览器&#xff09;和服务器之间如何传输超文本&#xff0c;也就是包含链接的文本。通常使用TCP【1】/IP协议来传输数据&#xff0c;默认端口为80。 HTTPS是超文本传输安全协议&#xff0c;具有CA证书。…...

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…...

VUE3项目的几种创建方式

文章目录 1.使用 Vue CLI (Vue Command Line Interface):2.使用 Create Vue App:3.使用 Vite:4.使用图形用户界面 (GUI):5.纯手工搭建6.基于模板创建: 1.使用 Vue CLI (Vue Command Line Interface): Vue CLI 是官方推荐的方式来快速搭建 Vue 项目的基础结构。命令&#xff1a…...

VBA进行excel坐标转换

在Excel里利用坐标绘图时&#xff0c;可以比较容易想到采用数据透视表&#xff0c;但是数据透视表生成的图不可更改&#xff0c;因此本案例采用VBA进行坐标变换而不改变原始值来转换图像&#xff0c;即实现图像的左右翻转和上下翻转&#xff0c;如下图所示&#xff0c;选择map的…...

使用pytorch深度学习框架搭建神经网络

简介 现在主流有两个框架pytorch和TensorFlow,本文主要介绍pytorch PyTorch&#xff1a;由 Facebook 的人工智能研究小组开发和维护。PyTorch 以其动态计算图&#xff08;Dynamic Computational Graph&#xff09;和易用性著称&#xff0c;非常适合研究人员和开发者进行实验和…...

Hive数据库与表操作全指南

目录 Hive数据库操作详解 创建数据库 1&#xff09;语法 2&#xff09;案例 查询数据库 1&#xff09;展示所有数据库 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;案例 2&#xff09;查看数据库信息 &#xff08;1&#xff09;语法 &#xff08;2&#…...

UniaApp引入Iconfont

一、下载图标资源 登录到阿里巴巴矢量图标库&#xff08;iconfont&#xff09;官网&#xff08;https://www.iconfont.cn/&#xff09;。找到你需要的图标并添加到购物车&#xff0c;然后点击购物车图标进入到管理界面&#xff0c;选择 “下载代码”。在下载选项中选择 “Font…...

面试题:软件测试缺陷产生的原因有哪些?

软件缺陷产生的原因多种多样&#xff0c;一般可能有以下几种原因&#xff1a; 1.需求表述、理解、编写引起的错误。 2.系统架构设计引起的错误。 3.开发过程缺乏有效的沟通及监督&#xff0c;甚至没有沟通或监督。 4.程序员编程中产生的错误。 5.软件开发工具本身隐藏的问…...

RabbitMQ 04 集群

01...

axure9勾选多个删除,弹框显示多个中继器编号

文本框 情形是删除逗号 文本框内插入数据...

Git 使用指南 --- 版本管理

序言 Git 是一个开源的 分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说&#xff0c;掌握 Git 的使用是必要的。  在这个系列中&#xff0c;将详细的介绍 Git 的使用和原理&#xff0c;话不多说&#xff0c;让我们开始吧。…...

C#进阶-ASP.NET实现可以缩放和旋转的图片预览页

本文详细介绍了如何在ASP.NET WebForms中实现一个功能丰富的图片预览页面。通过结合HTML、CSS和JavaScript&#xff0c;用户可以方便地对图片进行放大、缩小以及旋转操作。文章从页面的基本布局开始&#xff0c;逐步讲解了如何设置图片展示区、添加控制按钮、编写CSS样式以及实…...

【小程序 - 大智慧】深入微信小程序的核心原理

目录 课程目标背景双线程架构WebView 结构快速渲染 PageFrame编译原理Exparser通讯系统生命周期基础库解包跨端框架预编译半编译半运行运行时框架 主流技术Tarouni-app汇总 下周安排 课程目标 本次课程主要通过后台管理小程序回顾一下小程序的高阶语法&#xff0c;然后讲解整体…...

Qt 去掉QDialog对话框的问号

QT 对话框的问号是什么&#xff1f; QDialog默认的window flag中包含了Qt::WindowContextHelpButtonHint,这个flag意思是在窗口上提供“上下文帮助”按钮 使用方式/调用方式 void QWidget::setWhatsThis(const QString &)比如&#xff1a; ui->lineEdit_1->setWh…...

Blender MMD Tools终极指南:3步实现MikuMikuDance模型完美导入

Blender MMD Tools终极指南&#xff1a;3步实现MikuMikuDance模型完美导入 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tool…...

Z-Image-Turbo-rinaiqiao-huiyewunv 开发工具链:使用Cursor智能IDE加速模型集成代码编写

Z-Image-Turbo-rinaiqiao-huiyewunv 开发工具链&#xff1a;使用Cursor智能IDE加速模型集成代码编写 1. 引言 如果你正在尝试把Z-Image-Turbo这类图像生成模型集成到自己的项目里&#xff0c;可能遇到过这样的场景&#xff1a;对着API文档&#xff0c;一行行敲着重复的请求代…...

正规DAPP的奖励,到底来自哪里?(Web3避坑指南)

市面上正规的DAPP项目&#xff0c;那些奖励到底源自何处&#xff1f;这是一个看似基础&#xff0c;却能筛选出绝大多数Web3坑的核心问题——很多人盲目追逐高收益&#xff0c;却从未深究“钱从哪来”&#xff0c;最终沦为资金盘的接盘侠。今天&#xff0c;我们就沉下心聊聊这个…...

DCT-Net安全加固:防范对抗样本攻击的防御方案

DCT-Net安全加固&#xff1a;防范对抗样本攻击的防御方案 1. 当卡通化遇上安全威胁&#xff1a;为什么DCT-Net需要防护 最近帮几个做数字人业务的朋友部署DCT-Net时&#xff0c;他们提了一个让我思考很久的问题&#xff1a;“我们用它生成卡通头像、做社交娱乐、甚至用于隐私…...

Linux下frp内网穿透实战:从配置到管理面板的完整指南(含SSH+HTTP双协议)

Linux下frp内网穿透实战&#xff1a;SSH与Web服务双通道配置指南 当你需要在外网访问公司内网的开发环境&#xff0c;或是向客户演示本地搭建的Web应用时&#xff0c;内网穿透技术就像一把打开防火墙之门的钥匙。不同于市面上收费的穿透工具&#xff0c;frp以其开源免费、配置灵…...

S2-Pro模型安全与合规应用指南:内容过滤与偏见缓解策略

S2-Pro模型安全与合规应用指南&#xff1a;内容过滤与偏见缓解策略 1. 企业级AI部署的安全挑战 当企业考虑部署S2-Pro这类大语言模型时&#xff0c;安全与合规问题往往成为首要考量。不同于个人使用场景&#xff0c;企业应用需要面对更严格的监管要求、更复杂的用户群体以及更…...

OpenClaw敏感数据处理:Qwen3-32B私有镜像的加密通信方案

OpenClaw敏感数据处理&#xff1a;Qwen3-32B私有镜像的加密通信方案 1. 为什么需要加密通信方案 上周帮朋友部署OpenClaw自动化财务对账流程时&#xff0c;遇到一个棘手问题&#xff1a;当系统自动处理银行流水和发票PDF时&#xff0c;这些敏感数据在传输过程中竟然以明文形式…...

快速上手:CYBER-VISION零号协议Node.js后端服务集成指南

快速上手&#xff1a;CYBER-VISION零号协议Node.js后端服务集成指南 你是不是已经部署好了CYBER-VISION零号协议模型&#xff0c;看着那个命令行界面&#xff0c;心里琢磨着&#xff1a;“这玩意儿怎么才能接到我的Web应用里去&#xff1f;” 别急&#xff0c;这正是我们今天要…...

带行星传动装置的电动螺旋拆卸器设计【说明书 cad图纸 solidworks三维】

在机械维修与设备拆解领域&#xff0c;传统工具常因扭矩不足或操作空间受限&#xff0c;导致螺栓卡滞、部件损坏等问题。带行星传动装置的电动螺旋拆卸器通过集成行星齿轮系统与电动驱动模块&#xff0c;有效解决了这一痛点。其核心作用在于利用行星齿轮的行星轮系结构&#xf…...

SSM学习之使用@ResquestBody注解处理json格式的请求参数

在学习ajax异步请求的时候&#xff0c;如果通过post请求发送json格式的请求参数&#xff0c;服务端是无法通过request.getParameter()方法获取请求参数的。那么在ssm学习过程中&#xff0c;我学到了一个处理json格式的请求参数的注解RequestBody。它的作用是将请求体中的内容和…...