设计模式-结构性模式-桥接模式

1.桥接模式定义

        桥接模式就是将抽象部分与他的实现部分分离,使他们都可以独立的变化;

        桥接模式用一种巧妙地方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效地控制了系统中类的个数;

1.1 桥接模式的优缺点

优点

  • 分离抽象接口及其实现部分,桥接模式使用对象间的关联关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的纬度来变化;
  • 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了单一职责原则,复用性差,类的个数多;
  • 桥接模式提高了系统的可扩展性,在不同变化维度中任意扩展一个纬度不需要修改原有系统,符合开闭原则;

缺点

  • 桥接模式的使用会增加系统的理解和设计难度,由于关联关系建立在抽象层,要求开发者一开始就要对抽象层进行设计和编程;
  • 桥接模式要求正确识别出系统中的不同变化的维度,需要一定的经验,因此具有一定的局限性;

1.2 桥接模式使用场景

  •  需要提供平台独立性的应用程序时,如不同数据库的JDBC驱动程序;
  • 需要在某种统一协议下增加更多组件时,如支付场景,行为统一为收款、付款等具体实现为微信、支付宝等;
  • 基于消息驱动的场景,行为统一为发送、接收、处理等,具体的实现为短信、邮箱等;
  • 拆分复杂的类对象,当一个类包含大量对象和方法;
  • 希望从多个独立维度扩展时,如系统功能性和非功能性角度,业务和技术角度;

2.桥接模式的原理

  • 抽象化角色(Abstraction):主要负责定义出该角色的行为,并包含一个对现实化对象的引用;
  • 扩展抽象化角色(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法;
  • 实现化角色(Implementor):定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用;
  • 具体实现化角色(Concrete Implementor):给出实现化角色接口的具体实现;

        桥接模式我理解的就是由一条主线转为树状结构,将类的不同变化维度分离开;

3.桥接模式实现

【实例】

        模拟支付场景,不同的支付工具(支付宝、微信)有着不同的支付方式(密码、指纹)

​​​​​​​

【代码】

        支付模式接口(实现化角色)

public interface IPayMode {//安全校验功能: 对各种支付模式进行风控校验boolean security(String uId);
}

        具体支付模式(具体实现化角色)

//指纹支付及风控校验
public class PayFingerprintMode implements IPayMode {@Overridepublic boolean security(String uId) {System.out.println("指纹支付,风控校验-指纹信息");return true;}
}//密码支付及风控校验
public class PayPasswordMode implements IPayMode {@Overridepublic boolean security(String uId) {System.out.println("密码支付,风控校验-环境安全");return false;}
}

        支付抽象类(抽象化角色)

public abstract class Pay {//桥接对象protected IPayMode payMode;public Pay(IPayMode payMode) {this.payMode = payMode;}//划账功能public abstract String transfer(String uId, String tradeId, BigDecimal amount);}

        支付工具实现(扩展抽象化角色)

public class WxPay extends Pay {public WxPay(IPayMode payMode) {super(payMode);}@Overridepublic String transfer(String uId, String tradeId, BigDecimal amount) {System.out.println("微信渠道支付划账开始......");boolean security = payMode.security(uId);System.out.println("微信渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);if(!security){System.out.println("微信渠道支付划账失败!");return "500";}System.out.println("微信渠道划账成功! 金额: "+ amount);return "200";}
}public class AliPay extends Pay {public AliPay(IPayMode payMode) {super(payMode);}@Overridepublic String transfer(String uId, String tradeId, BigDecimal amount) {System.out.println("支付宝渠道支付划账开始......");boolean security = payMode.security(uId);System.out.println("支付宝渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);if(!security){System.out.println("支付宝渠道支付划账失败!");return "500";}System.out.println("支付宝渠道划账成功! 金额: "+ amount);return "200";}
}

        客户端

Pay wxpay = new WxPay(new PayPasswordMode());
wxpay.transfer("wx_00100100","10001900",new BigDecimal(100));Pay aliPay = new AliPay(new PayFingerprintMode());
aliPay.transfer("jlu1234567","567689999999",new BigDecimal(200));

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

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

相关文章

Leetcode JAVA刷刷站(99)恢复二叉搜索树

一、题目概述 二、思路方向 要解决这个问题,我们可以采用中序遍历二叉搜索树(BST)的方法,因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了,所以中序遍历的结果中将有两个位置上的元素是逆序的。…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前,先回顾一下什么是 DevOps。它没有统一的定义,但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年,软件开发和 I…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建,发布 2. 利用 BAT 来一键部署…

【STM32】FMC

FMC功能与FSMC类似,但比FSMC更强大,但仅在F4 / F7 / H7等高级一点的MCU上支持,F1不支持。虽然我的是F103,但顺便都看了。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框,多种方式的逻辑,多种场景 原先通过实战总结,基本的知识推荐阅读: 详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版&#x…

秋招复习笔记——嵌入式裸机开发

底层相关的内容,之前掌握的不扎实,现在重新把相关重点记录一下,做个笔记记诵。 相关基础知识 ST简单内容 用的F103ZET6,72MHz,FLASH是512KB,SRAM是64KB,144个引脚,2基本定时器&am…

目标 CDC实例数据库更改密码,预定启动报错SQL 错误代码为“-30082”。SQL 状态为:08001。

更改完CDC目标端实例密码后,登录MC更新存储器密码,存储器可正常连接,启动预定报错如下: 源 IBM Data Replication 未获授权,无法复制到该目标。 登录认证失败。 发生 SQL 异常。SQL 错误代码为“-30082”。SQL 状态…

嵌入式学习——ARM学习(1)

1、存储器 高速缓存(Cache)通常分为三级:L1、L2 和 L3。它们的主要功能和特点如下: 这三级缓存的设计旨在通过层次化存储来优化数据访问速度和处理器性能。 1、L1 缓存: 位置:直接集成在处理器核心内。 大小…

打手机检测算法源码样本展示打手机检测算法实际应用场景介绍

打手机检测算法是一种利用计算机视觉技术来监测和识别人们在特定区域如驾驶舱、考场或其他敏感区域非法使用手机的行为。这种算法对于提高安全性和确保规则的遵守具有重要意义。以下是关于打手机检测算法源码及其实际应用的详细阐述: 1. 算法实现 - 深度学习框架&a…

【selenium点选下拉框】解决无法选中对应选项的问题

需求 使用selenium点击下拉框,选中【是】选项。 代码 方法1 # 点击下拉框 driver.find_element(xpath,//*[id"basicProcessDetail"]/div[2]/div[2]/div[1]/div/div[2]/div/div/div/div[1]/div[2]/form/div[11]/div[1]/div/div/div[1]/div[1]/div/i).…

雷达图概述以及实例

目录 一.雷达图概述1.何为雷达图2.雷达图的构成要素 二.实例(以Excel、Python为例 )1.Excel(2021版)2.Python 一.雷达图概述 1.何为雷达图 雷达图,是一种展现多维度数据间相对重要性或程度的可视化图形。以中心点为起…

LabVIEW高速数据采集关键问题

在LabVIEW进行高速数据采集时,需要关注以下几个关键问题: 数据采集硬件的选择: 高速数据采集需要高性能的数据采集硬件,例如NI PXIe、USB DAQ等模块。硬件的选择应根据采集速率、通道数、精度、以及应用场景的具体需求来确定。 采集速率与带…

ByteBuffer详解

文章目录 1. ByteBuffer是抽象类,他的主要实现类为2. 获取方式3. 核心结构4. 核心API5. 字符串操作 1. ByteBuffer是抽象类,他的主要实现类为 HeapByteBuffer 堆ByteBuffer JVM内的堆内存 —> 读写操作 效率低 会受到GC影响MappedByteBuffer(DirectB…

桥接模式-多类型登录方式的思考

桥接模式-SSO单点登录 背景:(业务细节已脱敏)需求:问题:解决方式: OAuth2.0 实现单点登录四种授权模式桥接模式优化问题代码实现 背景:(业务细节已脱敏) 基于实习期间的一个代码重构的思考——业务细节已脱敏 基于内部旧框架实现业务toB管理系统,需要迁移数据并新的…

uni-app 手记集。

1、uni-app 是一个使用 Vue.js 开发的前端应用的框架&#xff0c;所以不会Vue.js的小伙伴可以先去看看Vue.js的基础教学。 2、.vue文件结构 <template><div class"container"></div> </template><script type"text/ecmascript-6&q…

【DiskGenius硬盘分区】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

TCP系列相关内容

一、TCP上传文件 loop——本地回环测试地址。 void *memset&#xff08;void *s,int c,size_t n&#xff09;——给一个变量设定一个值。 1、“粘包”问题 两次分别发送的数据&#xff0c;被一起接收形成该现象。 原因&#xff1a;TCP流式套接字&#xff0c;数据与数据间没…

前端速通面经八股系列(二)—— HTML篇

HTML高频面经八股目录 1. src和href的区别2. 对HTML语义化的理解3. DOCTYPE(⽂档类型) 的作⽤4. script标签中defer和async的区别5. 常⽤的meta标签有哪些6. HTML5有哪些更新1. 语义化标签2. 媒体标签3. 表单4. 进度条、度量器5.DOM查询操作6. Web存储7. 其他 7. img的srcset属…

三种通过代码创建矢量文件的方法及例子

现有四个点&#xff1a;(1, 1), (2, 2), (3, 3), (4, 4) 以这四个点围起来就是一个面。 如何通过python创建矢量文件。 我们以创建一个面矢量文件为例子&#xff0c;进行阐释。 我们可以使用geopandas、fiona、gdal库完成矢量创建。 geopandas 假设我们创建的矢量文件格式…

Chrome H265 WebRTC 支持

Chrome从127版本开始支持RTC H265解码&#xff0c;这样服务器就不需要对H265转码了&#xff0c; H5S和USC会自动检测浏览器支持的解码类型并自动判断是否启动转码&#xff0c;这样客户端不用关心摄像机具体是H264还是H265&#xff0c;尽量使用带GPU的客户端&#xff0c;这样服务…