Java设计模式之结构型-桥接模式(UML类图+案例分析)

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

1、支付方式

2、支付渠道 

五、总结


一、基础概念

桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。

桥接模式的核心思想是把抽象(abstraction)与实现(implementation)分离开来,从而可以独立变化。

抽象类定义抽象接口,包含对实现对象的引用。

实现类提供各种实现方案,抽象接口调用实现对象的相关方法完成工作。

这样抽象部分和实现部分就可以通过抽象层建立联系,相互独立地变化而不影响对方。

二、UML类图

三、角色设计

角色描述
抽象类定义抽象类,并包含一个对实现类对象的引用
扩展抽象类是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
实现类接口定义实现类接口,供扩展抽象类调用
具体实现类实现类接口的具体实现

四、案例分析

在日常生活中不管用什么渠道进行支付,例如支付宝、微信支付和云闪付等,它们都提供了三种支付方式,分别是密码支付、指纹支付和人脸支付,下面就通过代码来实现这个例子让大家更容易去理解这个设计模式。

1、支付方式

定义支付方式的接口:

package mode;public interface PayMode {void mode();}

密码支付实现类: 

package mode;public class PwdPayMode implements PayMode {@Overridepublic void mode() {System.out.println("密码支付");}
}

指纹支付实现类:

package mode;public class FingerPayMode implements PayMode{@Overridepublic void mode() {System.out.println("指纹支付");}
}

人脸支付实现类:

package mode;public class FacePayMode implements PayMode {@Overridepublic void mode() {System.out.println("人脸支付");}
}

2、支付渠道 

定义支付渠道的抽象类:

package channel;import mode.PayMode;public abstract class PayAbstract {protected PayMode payMode;public PayAbstract(PayMode payMode) {this.payMode = payMode;}public abstract void transfer();}

支付渠道抽象类子类-支付宝:

package channel;import mode.PayMode;public class ZfbPay extends PayAbstract {public ZfbPay(PayMode payMode) {super(payMode);}@Overridepublic void transfer() {System.out.println("支付宝渠道");this.payMode.mode();}}

支付渠道抽象类子类-微信:

package channel;import mode.PayMode;public class WxPay extends PayAbstract {public WxPay(PayMode payMode) {super(payMode);}@Overridepublic void transfer() {System.out.println("微信渠道");this.payMode.mode();}}

客户端:

public class Client{public static void main(String[] args) {PayAbstract wxPay = new WxPay(new PwdPayMode());wxPay.transfer();PayAbstract wxPay2 = new WxPay(new FingerPayMode());wxPay2.transfer();PayAbstract wxPay3 = new WxPay(new FacePayMode());wxPay3.transfer();PayAbstract zfbPay = new ZfbPay(new PwdPayMode());zfbPay.transfer();PayAbstract zfbPay2 = new ZfbPay(new FingerPayMode());zfbPay2.transfer();PayAbstract zfbPay3 = new ZfbPay(new FacePayMode());zfbPay3.transfer();}
}

运行结果如下:

五、总结

优点:

1、抽象和实现分离,提高了扩展性,符合开闭原则。

2、实现细节对客户透明,可以对客户端隐藏变化。

3、符合组合复用原则,不使用继承提高复用性。

缺点:

1、增加了系统的复杂性。

应用场景:

1、一个抽象有多种实现需要动态切换时。

2、系统需要在多个平台上运行时。

3、一个抽象有多个变化维度需要独立扩展。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle

桥接模式实现了抽象部分和实现部分的分离,使它们各自只需要关注一个单一的职责。

2、开闭原则(Open Closed Principle

桥接模式使抽象部分和实现部分可以独立扩展开放,而不需要修改对方的代码。

3、组合复用原则(Composite Reuse Principle

桥接模式充分利用了组合和聚合关系增加系统的复用性。

4、里氏替换原则(Liskov Substitution Principle

抽象部分针对接口编程,其引用实现类对象可以替换为其子类,继续运行。

5、依赖倒转原则(Dependency Inversion Principle

抽象部分和实现部分通过接口联系,实现了面向接口编程隔离了依赖关系。

总的来说桥接模式通过抽象和实现分离,实现解耦,让它们可以独立变化,从而保持高扩展性。

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

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

相关文章

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述: 从GitHub上克隆仓库到本地,出现错误: unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题:从终端输入: git config --global http.sslVer…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量,用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径,它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时,它们会默认从 GOROOT…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜(SEM)是一种功能强大的工具,广泛用于高分辨率的生物和半导体样品检测。然而,对于大面积或3D成像,SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

关于 Eclipse 的一场 “三角关系”

上个世纪 90 年代&#xff0c;世界上的计算机要么不联网&#xff0c;要么在企业内部联网。但是&#xff0c;在互联网的概念下&#xff0c;计算机之间共享信息和资源的需求成为了必要。 1995 年 5 月&#xff0c;Java 横空出世。Java 的父亲是当时凭借 Solaris 操作系统风头正盛…

【朱颜不曾改,芳菲万户香。AIGC人物图片创作---InsCode Stable Diffusion 美图活动一期】

【朱颜不曾改&#xff0c;芳菲万户香。AIGC人物图片创作 ---InsCode Stable Diffusion 美图活动一期】 本文目录&#xff1a; 一、 Stable Diffusion 模型在线使用 1.1、模板运行环境配置 1.2、运行InsCode平台的Stable Diffusion模板 二、Stable Diffusion主界面功能 2.…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

谈 Delphi 中 JSON 的简便操作(非常简单)

我曾有讲过Delphi操作JSON的方法&#xff0c;特别是这一篇【delphi】类和记录的 helpers&#xff08;助手&#xff09;。但是因为当时是主要介绍的是Delphi的Helper&#xff0c;大家可能并没注意到Delphi中JSON的简便操作方法。 早期Delphi并没有自己的JSON操作库&#xff0c;大…

了解 JVM - 认识垃圾回收机制与类加载过程

前言 本篇通过介绍JVM是什么&#xff0c;认识JVM的内存区域的划分&#xff0c;了解类加载过程&#xff0c;JVM中垃圾回收机制&#xff0c;从中了解到垃圾回收机制中如何找到存活对象的方式&#xff0c;引用计数与可达性分析的方式&#xff0c;再释放垃圾对象时使用的方式&…

Kerberos协议详解

0x01 kerberos协议的角色组成 Kerberos协议中存在三个角色&#xff1a; 客户端(Client)&#xff1a;发送请求的一方 服务端(Server)&#xff1a;接收请求的一方 密钥分发中心(Key distribution KDC) 密钥分发中心分为两个部分&#xff1a; AS(Authentication Server)&…

Nacos (2.0版本之后)状态异常集群节点状态异常

在nacos 2.0 之后正常部署后节点状态仅有一个正常,其余均为DOWN 或者SUSPICIOUS 状态 查看日志后发现 ERROR Server check fail, please check server 192.168.172.104 ,port 9849 is available , error {} 其实是nacos 相互之间不能正常通信造成的,nacos客户端升级为2.x版…

apple pencil一代的平替有哪些品牌?苹果平板的触控笔

随着苹果Pencil系列的推出&#xff0c;平替电容笔在国内市场得到了较好的发展&#xff0c;随之的销量&#xff0c;也开始暴涨&#xff0c;苹果pencil因为价格太高&#xff0c;导致很多人买不起。目前市场上&#xff0c;有不少的平替电容笔&#xff0c;可以替代苹果的Pencil&…

MySQL 主从复制与读写分离

MySQL 主从复制与读写分离 一、mysql读写分离的概念1、什么是读写分离&#xff1f;2、为什么要读写分离呢&#xff1f;3、什么时候要读写分离&#xff1f;4、主从复制与读写分离5、mysql支持的复制类型 二、主从复制的工作过程三、MySQL 读写分离原理常见的 MySQL 读写分离分为…

【Distributed】分布式ELK日志文件分析系统(二)

文章目录 一、FilebeatELK 部署1. 环境部署2. 在 Filebeat 节点上操作2.1 安装 Filebeat2.2 设置 filebeat 的主配置文件 3. 在 Apache 节点上操作3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件 3. 启动3.1 在Logstash 组件所在节点启动3.2 在 Filebeat 节点 启动…

Stable Diffusion 用2D图片制作3D动态壁纸

如果想让我们的2D图片动起来可以使用stable-diffusion-webui-depthmap-script插件在SD中进行加工让图片动起来。 这是一个可以从单个图像创建深度图,现在也可以生成3D立体图像对的插件,无论是并排还是浮雕。生成的结果可在3D或全息设备(如VR耳机或Looking Glass显示器)上查…

大模型加速学科升级,飞桨赋能北邮“X+大模型”特色小学期

在人工智能时代&#xff0c;设计师与产品经理比以往更加需要关注一个事实&#xff1a;那就是如何利用人工智能和数据分析技术&#xff0c;打造让用户心动的信息交互产品和用户体验&#xff0c;释放人-机协同共创的巨大潜能&#xff0c;是决定设计产能和竞争力的关键。 在产业的…

RabbitMQ ---- 消息队列

RabbitMQ ---- 消息队列 1. MQ 的相关概念1.1 什么是 MQ1.2 为什么要用 MQ1.3 MQ 的分类1.4 MQ 的选择 2. RabbitMQ2.1 RabbitMQ 的概念2.2 四大核心概念2.3 RabbitMQ 核心部分2.4 各个名词介绍2.5 安装 1. MQ 的相关概念 1.1 什么是 MQ MQ(message queue)&#xff0c;从字面…

爬虫之Scrapy

一 介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的&#xff0c;使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛&#xff0c;可用于如数据挖掘、监测和自动化测试等领域&#x…

什么是Docker

容器技术和虚拟机 虚拟机 和一个单纯的应用程序相比&#xff0c;操作系统是一个很重的程序&#xff0c;刚装好的系统还什么都没有部署&#xff0c;单纯的操作系统其磁盘占用至少几十G起步&#xff0c;内存要几个G起步。 在这台机器上开启三个虚拟机&#xff0c;每个虚拟机上…

PSI算法经典论文算法概述

文章目录 什么是隐私求交PSIPSI协议分类PSI算法的分类基于哈希函数的PSI算法基于不经意传输&#xff08;OT&#xff09;的 PSI算法基于GC的PSI算法基于公钥加密的PSI算法基于DH的PSI算法基于RSA盲签名的PSI算法基于同态加密的PSI算法 基于差分隐私的PSI算法 总结参考文献 什么是…