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.hqwc.cn/news/19635.html

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

相关文章

【UT学习记录】

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 Part1:Mock Part2:PowerMock Part3:Junit 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文…

Layui动态树详解

Layui动态树详解 一、什么是动态树形?二、Layui动态树形基本使用三、动态加载数据4.案列1.实体类2.dao方法3.子实现类4.jsp页面 前言 在前端开发过程中,树形控件是比较常用的控件之一。而Layui框架中,也提供了基于jQuery的树形控件。除了普通…

ChatGPT带我做四轴飞行器和自平衡小车

按照ChatGPT的说法,这款主板的的主控MCU、无线通信、电源管理、外设接口可以共用,需要差异化的有电机驱动、传感器的选择、控制算法和软件、电源供电。ChatGPT说的共用部分没啥争议,有差异化的地方需要细想下:电机驱动显然应该不同…

关系型数据库中如何进行事务管理

关系型数据库中如何进行事务管理 在关系型数据库中,事务管理是一项非常重要的功能。它允许数据库管理员在一个或多个数据库操作中实现原子性、一致性、隔离性和持久性(ACID)。 事务是一组数据库操作,它们必须全部执行或全部回滚…

验收户外LED显示屏有哪些标准

验收户外LED显示屏时,可以根据以下标准进行评估: 亮度和对比度:户外LED显示屏需要具有足够的亮度,以应对日间和强烈阳光的照射。检查显示屏在各种光照条件下的亮度表现,并确保对比度良好,以保证画面清晰可见…

数据结构--哈夫曼树

数据结构–哈夫曼树 带权路径长度 结点的 权 \color{red}权 权:有某种现实含义的数值(如:表示结点的重要性等) 结点的带权路径长度 \color{red}结点的带权路径长度 结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积 树的…

作为一个程序员一定要掌握的算法之遗传算法

目录 一、引言 1.1 目的 1.2 意义 二、遗传算法介绍 2.1 遗传算法的基本思想 2.2 遗传算法与其他算法的主要区别 2.3 基于Java的遗传算法设计思想 三、遗传算法的具体实现 3.1 系统功能模块图和说明 3.2 代码和说明 3.2.1 初始化 3.2.2 选择运算 3.2.3 交叉运算 3…

【车载Android】多用户(一) - Linux用户与Android多用户

现如今手机这样的移动设备已经是人手一台了,但是汽车依然是以家庭为单位使用,不同的家庭成员对于汽车的使用存在着差异,比如空间、功能、影音风格等。因此,“智能汽车”需要具备千人千面的特性,能够适应不同的用户和场…

Linux系统编程(信号处理机制)

文章目录 前言一、中断,异常,信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中…

mfc120u.dll丢失修复,mfc120u.dll缺失的解决方法

MFC120u.dll缺失的原因 当系统中缺少或损坏了MFC120u.dll文件时,就会出现"MFC120u.dll缺失"的错误提示。造成MFC120u.dll缺失的原因可能有以下几种情况: 1.文件删除或损坏:MFC120u.dll文件可能因为误删除、病毒感染、硬盘故障等原…

信创电子档案管理单机版系统之档案利用的功能介绍

专久智能信创电子档案管理单机版系统的档案利用,包括对电子档案的网上利用和对档案实体的借阅两种方式,用户对档案的利用都是通过 WEB 方式的档案网站实现的。 用户可以根据系统赋予的权限对电子档案目录进行检索查询,找到所需的档案目录&…

Hadoop单机部署和测试

Hadoop单机部署和测试 一.单机部署1.安装 JDK2.安装 HADOOP3.测试 一.单机部署 系统版本:cat /etc/anolis-release1.安装 JDK #!/bin/bashTOP_PATH$(pwd) JAVA_PATH/usr/local/java FILEls $TOP_PATH/ | grep jdk | grep .tar.gz | grep -v grep ## 清空历史版本 …