Java设计模式 _结构型模式_桥接模式

一、桥接模式

1、桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦,使得二者可以独立变化。

2、实现思路
使用桥接模式,一定要找到这个类中两个变化的维度:如支付功能中(平台类型,支付方式)或带颜色形状(形状,涂色)。
(1)、定义次维度规划抽象和实例方式(支付方式为抽象(接口),密码支付,扫脸支付,指纹支付为三种实例(接口实现类))。
(2)、次维度接口定义规范方法,每一种实现类遵循规范进行各自业务的实现。
(3)、定义主维度抽象类和实现类(支付渠道(抽象类),微信,支付宝(抽象类的实现类))
(4)、在主维度抽象类中,定义次维度的抽象属性,通过构造方法实例化该属性,定义统一的抽象方法(支付方法);
(5)、在主维度实现类中,通过自身方法和次维度属性的实现方法封装各自具体的业务方法。

二、代码示例

1、不使用桥接,直接判断

  // 定义和实现支付方法public static String doPay(String payUser,String receiveUser,double money, String payType,String securityMode){StringBuilder builder = new StringBuilder("");builder.append(payUser);if ("wechat".equals(payType)){builder.append("使用微信-");if ("password".equals(securityMode)){builder.append("密码支付");} else if("face".equals(securityMode)){builder.append("扫脸支付");}else if("fingerprint".equals(securityMode)){builder.append("指纹支付");}builder.append(money).append("元");}if ("alipay".equals(payType)){builder.append("使用支付宝-");if ("password".equals(securityMode)){builder.append("密码支付");} else if("face".equals(securityMode)){builder.append("扫脸支付");}else if("fingerprint".equals(securityMode)){builder.append("指纹支付");}builder.append(money).append("元");}builder.append("给").append(receiveUser);return builder.toString();}// 测试public static void main(String[] args) {System.out.println("直接方式");String directResult = doPay("张三", "李四", 30, "wechat", "password");System.out.println(directResult);directResult = doPay("张三", "王五", 10.6, "alipay", "fingerprint");System.out.println(directResult);}

运行结果:
在这里插入图片描述
说明:上面的示例中,虽然运行得到了正确的结果。但是从代码上看,所有的代码都写到一起,不利于代码管理和阅读;如果扩展支付方式或者支付平台,必然会影响彼此(如:扩展支付类型扫码支付,支付平台的微信和支付宝实现中都需要改造代码;再如:扩展支付平台中行支付,支付方式每一种都需要在新平台的方法中重写一遍),可以看出两个维度是强耦合关系,不符合设计模式的开闭原则。

2、桥接模式示例

// 支付类型接口--次维度抽象规范接口
public interface PayMode {String securityPay();
}
// 密码支付--次维度规范实现类1
public class PasswordMode implements PayMode {@Overridepublic String securityPay() {return "密码支付";}
}
// 扫脸支付--次维度规范实现类2
public class FaceMode implements PayMode {@Overridepublic String securityPay() {return "扫脸支付";}
}
// 指纹支付--次维度规范实现类3
public class FingerprintMode implements PayMode {@Overridepublic String securityPay() {return "指纹支付";}
}// 定义支付平台的抽象--主维度抽象方法
import lombok.Data;
@Data
public abstract class Pay {protected String payUser;protected String receiveUser;protected double money;protected PayMode payMode;   // 次维度的抽象属性public abstract String doPay();   // 支付方法
}
// 微信--主维度实现类1
public class WeChatPay extends Pay {public WeChatPay(Builder builder){this.payUser= builder.payUser;this.receiveUser= builder.receiveUser;this.money= builder.money;this.payMode= builder.payMode;}@Overridepublic String doPay() {   // 实现主维度方法return payUser+"使用微信-"+payMode.securityPay()+money+"元给"+receiveUser;}public static class Builder{     // 建造者模式private String payUser;private String receiveUser;private double money;private PayMode payMode;public Builder setPayUser(String payUser) {this.payUser = payUser;return this;}public Builder setReceiveUser(String receiveUser) {this.receiveUser = receiveUser;return this;}public Builder setMoney(double money) {this.money = money;return this;}public Builder setPayMode(PayMode payMode) {this.payMode = payMode;return this;}public WeChatPay build() {return new WeChatPay(this);}}
}
// 支付宝--主维度实现类2
public class AliPayPay extends Pay {public AliPayPay(Builder builder){this.payUser= builder.payUser;this.receiveUser= builder.receiveUser;this.money= builder.money;this.payMode= builder.payMode;}@Overridepublic String doPay() {  // 实现主维度方法return payUser+"使用支付宝-"+payMode.securityPay()+money+"元给"+receiveUser;}public static class Builder{    // 建造者模式private String payUser;private String receiveUser;private double money;private PayMode payMode;public Builder setPayUser(String payUser) {this.payUser = payUser;return this;}public Builder setReceiveUser(String receiveUser) {this.receiveUser = receiveUser;return this;}public Builder setMoney(double money) {this.money = money;return this;}public Builder setPayMode(PayMode payMode) {this.payMode = payMode;return this;}public AliPayPay build() {return new AliPayPay(this);}}
}
// 测试public static void main(String[] args) {System.out.println("桥接模式:");Pay wechatPay = new WeChatPay.Builder().setPayUser("张三").setReceiveUser("李四").setMoney(20.9).setPayMode(new PasswordMode()).build();System.out.println(wechatPay.doPay());Pay aliPay = new AliPayPay.Builder().setPayUser("张三").setReceiveUser("王五").setMoney(8.9).setPayMode(new FingerprintMode()).build();System.out.println(aliPay.doPay());}

运行结果:
在这里插入图片描述
说明:使用桥接模式,运行结果也满足需求。

3、桥接模式相对于直接调用的好处
1、解耦:使用桥接模式,如果扩展支付类型,仅通过新的类实现PayMode即可,不需要主维度代码修改;如果扩展支付平台,仅通过新的类实现Pay抽象类即可,不需要次维度代码修改;同时相对直接使用,更加准寻开闭原则。
2、代码逻辑更清晰,方便阅读。
3、更好的扩展方式。

但是桥接模式会增家类的定义和实现,一定层度上对框架的复杂度会有提升,所以实际场景还是根据自身情况决定比较好。

学海无涯苦作舟!!!

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

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

相关文章

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查…

七彩虹(Colorful)隐星P16 2023款笔记本电脑原装出厂Win11系统镜像下载 带建Recovery一键还原功能

七彩虹原厂Windows预装OEM专用系统,恢复出厂开箱状态一模一样 适用型号:隐星P16 23 链接:https://pan.baidu.com/s/1Ig5MQMiC8k4VSuCOZRQHUw?pwdak5l 提取码:ak5l 原厂W11系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

C# 使MessageBox.Show弹出框保持最前

要确保 MessageBox.Show 弹出框保持在最前面,你可以使用 MessageBoxOptions 枚举中的 SetForeground 选项。这将确保消息框置于其他窗口之前。 以下是如何在 C# 中使用 MessageBox.Show 来显示一个保持最前的消息框的示例代码: MessageBox.Show("…

如何确定DAC输出的最高速度

如何确定DAC输出的最高速度 一、引言 数字到模拟转换器(Digital-to-Analog Converter,简称DAC)是电子设备中常用的一个重要部件,其作用是将数字信号转换为模拟信号。在设计和使用DAC时,一个关键问题是确定DAC输出的最高速度,即能够实现的最大输出频率。本文将介绍如何确…

惠海原厂直销 H6922 升压恒压IC芯片 2.8-40V升48V60V72V80V100V方案 高效率 低功耗

升压恒压IC芯片是一种在2.8V至40V的宽输入电压范围内工作,并能够将输出电压升高到48V、60V、72V、80V甚至100V的芯片。这种芯片以高效率、低功耗为特点,因此非常适合于对电源效率和功耗有严格要求的应用领域。升压恒压IC芯片的工作原理通常基于电感和电容…

使用FPGA发送一个经过曼彻斯特编码的伪随机序列

介绍 这几天突然就不知道要使用FPGA实现什么样的功能了,然后就跑去学习数电了,学的也是晕晕的。正好之前写了一个使用FPGA发送伪随机序列的代码,然后因为需要使用曼彻斯特编码,所以又加了一个模块吧,使得最后输出的波形经过曼彻斯特编码。 曼彻斯特编码 首先,曼彻斯特编…

前端入门:HTML(css轮廓,填充,宽高)

1.CSS轮廓 注意: outline中,out-style是必须要设置的,格式为: outline-style一共有以下的几个值: 2.CSS填充属性 这是一个用于在一个元素的内容周围产生空间,也就是边框内到白框外之间的距离,…

Ubuntu 22.04 安装Oracle 11g Express Edition

目录 一、系统环境 二、预安装软件 三、安装Oracle 四、登录数据库 Ubuntu 22.04上安装Oracle 11g Express Edition的过程。 一、系统环境 操作系统:Ubuntu 22.04.4 LTS 数据库版本:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64b…

一款神奇的地理数据可视化python库

在地理信息系统(GIS)和地理数据可视化领域,Python的易用性和强大的库支持使其成为处理地理数据的理想选择之一。今天我们介绍Cartopy库,它为地理数据可视化提供了强大的支持。无论是对于GIS专业人士还是对地理数据可视化感兴趣的初…

机器人项目相关

机器人项目相关 1. Nvidia 1.1 Jetson 1.1.1 初步安装Riva教程 llamaspeakJetson AGX Orin踩坑记录(1)安装Riva 参考知乎链接:https://zhuanlan.zhihu.com/p/670007305 1.1.2 NVIDIA Jetson AI Lab 借助 NVIDIA Jetson™ 将生成式 AI…

前端光标操作获取光标位置,移动光标位置到最后

获取光标位置 const getCursorIndex ()>{// 获取当前光标位置setTimeout(()>{const selection window.getSelection();const range selection.getRangeAt(0);const offset range.startOffset;console.log(光标位置:, offset);}) }const selection windo…

Windows环境下nvm的安装与使用

nvm全名node.js version management,顾名思义是一个管理多个nodejs的版本工具。通过它可以安装和切换不同版本的 nodejs,为了解决 node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本。 一、下载 nvm安装包地址: https://gith…

vite: 项目中使用Sass

1.安装 npm add sass 注意:有些博客中会告诉你需要 安装sass-loader和sass,这是webpack项目中的做法。而在Vite环境中,如果你想使用Sass预处理器,实际上并不需要单独安装sass-loader。Vite默认集成了对Sass的支持,你…

工具方法 - 发挥你的优势

Use your strengths 懒惰或谦虚是否意味着有时你没有将自己的优势发挥到极致? 因为一旦你知道了自己的长处,那么作为一名优秀的团队成员,你的职责就是发挥这些长处。 自愿参加任何你能为之做出贡献的活动。 你的团队目前面临哪些挑战&#xf…

前端项目学习记录1:svg图标的封装与使用

1.下载svg依赖 pnpm i vite-plugin-svg-icons -D 还有一个,下面的不安装可能会报错 pnpm i fast-glob -D 2.vite.config.ts配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的…

使用yolov8+QT+onnrunxtime进行开发的注意事项

1、本来想尝试做一个C的yolov8在QT5.15.2的应用; 因此,在实现这个目标的时候,我先用了yolov8自带的export进行导出,使用的代码很简单,如下所示: import os from ultralytics import YOLO# model YOLO(&q…

网络安全之防范钓鱼邮件

随着互联网的快速发展,新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势,利用网络钓鱼进行欺骗的行为越来越猖獗,对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件,而邮件标题和内容,…

基于残差神经网络的汉字识别系统+pyqt前段界面设计

研究内容: 中文汉字识别是一项具有挑战性的任务,涉及到对中文字符的准确分类。在这个项目中,目标是构建一个能够准确识别中文汉字的系统。这个任务涉及到数据集的收集、预处理、模型训练和评估等步骤。尝试了使用残差神经网络(ResNet&#x…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法:我们找到一个字符串的全排列,然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列,所以我们知道两个字符串对应的字符出现的个数相同,那么…

ubuntu24.04 正式放弃VNC

1、ubuntu22.04支持情况 去年9月在22.04中测试发现由于gnome启用Wayland桌面,然而Wayland和vnc兼容不佳,就已经黑屏等问题,当时是vnc和ms-rd(微软远程桌面)两个菜单。 Ubuntu22.04 vnc远程黑屏_ubuntu 远程桌面vnc黑屏-CSDN博客文章浏览阅读…