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系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

惠海原厂直销 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填充属性 这是一个用于在一个元素的内容周围产生空间,也就是边框内到白框外之间的距离,…

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

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

Windows环境下nvm的安装与使用

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

使用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博客文章浏览阅读…

机器学习在医疗行业的应用:颠覆传统诊疗模式,开启智慧医疗新时代

文章目录 一、精准诊断的突破二、药物研发的革新三、患者管理的智能化四、智能辅助决策系统五、机器学习在医疗行业的前景 随着科技的飞速发展,机器学习作为人工智能的核心技术,正逐渐渗透到各个行业中,其中在医疗行业的应用尤为引人瞩目。机…

纯js对比excel小工具

如何使用JavaScript和xlsx.js实现Excel文件对比:实战指南 在日常办公或数据分析工作中,我们经常需要比较两个Excel文件中的数据差异。手动对比不仅耗时费力,还容易出错。本文将带你通过一个简单的网页应用,利用JavaScript和开源库…

Dockerfile 镜像创建扩展

一、构建SSH镜像 创建dockerfile步骤&#xff1a; 1. 建立工作目录 mkdir /opt/sshd cd /opt/sshd/2.编辑Dockerfile vim Dockerfile #第一行必须指明基于的基础镜像 FROM centos:7 #作者信息 MAINTAINER this is ssh image <wwk> #镜像的操作指令 RUN yum -y update R…

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了&#xff0c;提示“此站点遇到了致命错误”,如图&#xff1a; 这个网站一直都是正常运行的&#xff0c;最近也没有过什么更新&#xff0c;按理说不应该会出现问题&#xff0c;我担心可能是主机方面做了什么调整导致&#xff0c;所以联系了Ho…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

ngrinder3.4创建的maven项目-ngrinder-groovy3.4依赖一直下载失败-解决办法

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

人脸识别系统架构

目录 1. 系统架构 1.1 采集子系统 1.2 解析子系统 1.3 存储子系统 1.4 比对子系统 1.5 决策子系统 1.6 管理子系统 1.7 应用开放接口 2. 业务流程 2.1 人脸注册 2.2 人脸验证 2.2.1 作用 2.2.2 特点 2.2.3 应用场景 2.3 人脸辨识 2.3.1 作用 2.3.2 特点 2.3.3…

10分钟了解数据质量管理-奥斯汀格里芬 Apache Griffin

在不重视数据质量的大数据发展时期&#xff0c;Griffin并不能引起重视&#xff0c;但是随着数据治理在很多企业的全面开展与落地&#xff0c;数据质量的问题开始引起重视。 1.Griffin简介 Griffin是一个开源的大数据数据质量解决方案&#xff0c;由eBay开源&#xff0c;它支持…