设计模式02-桥接模式(Java)

server/2024/10/20 14:03:15/

4.2 桥接模式

**1.定义:**将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

2.结构:

image-20241008111757365

  • 抽象化角色 :定义抽象类,并包含一个对实现化对象的引用。

  • 扩展抽象化角色 :是抽象化角色的子类,实现父类中的业务方法, 并通过组合关系调用实现化角色中的业务方法。

  • 实现化角色 :定义实现化角色的接口,供扩展抽象化角色调用。

  • 具体实现化角色 :给出实现化角色接口的具体实现。

3.原理分析:

  • 桥接模式使用了开闭原则,里氏代换原则,依赖倒转原则。
  • 脱耦:将抽象化与实现化直接的耦合解脱开,将它们之间的强关联转化为弱关联,将两个角色之间的继承关系转化为关联关系。
抽象化:对象的共同属性抽出来形成的类
实现化:针对抽象化给出具体的实现

4.代码模板:

java">public interface Implementor {public void operationImpl();
}public abstract class Abstraction {protected Implementor implementor;public void setImplementor(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}public class RefindedAbstraction extends Abstraction {@Overridepublic void operation() {implementor.operationImpl();}
}

5.案例说明:

image-20241008113306026
  • 类图:

image-20241008113348455

  • Java代码实现

抽象类:对OS视频进行扩展

java">public abstract class OSVersion {protected VideoFile videoFile;public void setVideoFile(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName);
}

抽象类实现:

public class LinuxVersion extends OSVersion{@Overridepublic void play(String fileName) {videoFile.decode("Linux", fileName);}
}public class WindowsVersion extends OSVersion{@Overridepublic void play(String fileName) {videoFile.decode("Windows", fileName);}
}

实现类接口:进行视频播放格式的扩展

java">public interface VideoFile {public void decode(String osType, String fileName);
}

具体的实现类:

java">public class MPEGFile implements VideoFile{@Overridepublic void decode(String osType, String fileName) {System.out.println("位于" + osType + "操作系统的" + fileName + ".MPEG文件进行播放");}
}public class WMVFile implements VideoFile{@Overridepublic void decode(String osType, String fileName) {System.out.println("位于" + osType + "操作系统的" + fileName + ".WMV文件进行播放");}
}

Main函数

java">public class Main {public static void main(String[] args) {WMVFile wmvFile = new WMVFile();WindowsVersion windowsVersion = new WindowsVersion();windowsVersion.setVideoFile(wmvFile);windowsVersion.play("刺客五六七");MPEGFile mpegFile = new MPEGFile();LinuxVersion linuxVersion = new LinuxVersion();linuxVersion.setVideoFile(mpegFile);linuxVersion.play("喜羊羊与灰太狼");}
}

6.桥接模式的优点

  • 实现了对抽象和实现之间的解耦

  • 优化了类直接多继承的

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

  • 实现细节对客户透明,可以对用户隐藏抽象细节

  • (缺点)难以识别要区分的两个独立变化的维度

7.桥接模式的使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

8.桥接模式应用

  • Java应用程序通过虚拟机对其底层指令集抽象,针对不同的OS平台依赖不同的虚拟机实现跨平台
  • JDBC驱动程序是抽象,各个数据库是实现类型

9.桥接模式的拓展

在使用关联关系是,及在抽象类引入实现类接口时可能会出现不适配的情况,这是可以用适配器类型将其转换成抽象类可以适配的类进行关联。


http://www.ppmy.cn/server/133359.html

相关文章

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…

如何使用Python对Excel、CSV文件完成数据清洗与预处理?

在数据分析和机器学习项目中,数据清洗与预处理是不可或缺的重要环节。 现实世界中的数据往往是不完整、不一致且含有噪声的,这些问题会严重影响数据分析的质量和机器学习模型的性能。 Python作为一门强大的编程语言,提供了多种库和工具来帮…

AWS Aurora 实例更换实战:最小化业务影响的升级策略

在本文中,我们将详细介绍如何在生产环境中安全地更换 AWS Aurora 实例,包括主写实例和只读实例的更换过程。我们的目标是将影响降到最低,同时确保系统的稳定性和性能。 背景 随着业务的增长,我们需要升级现有的 Aurora 实例以提供更好的性能和更大的容量。本次更换涉及主…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

TiDB 关联子查询及半连接的优化实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/e9563a23 导读 TiDB 针对子查询语句会执行多种 子查询相关的优化 &#xff0c;以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询&#xff0c;TiDB 优化器默认包…

python 爬虫模拟登录

在使用 Python 编写爬虫时&#xff0c;模拟登录是一个非常常见的需求&#xff0c;尤其是当你需要爬取需要身份验证的数据时。模拟登录通常需要以下步骤&#xff1a; 分析登录页面&#xff1a;确定提交登录请求的 URL 和相关参数。发送登录请求&#xff1a;模拟用户发送登录表单…

UE4 材质学习笔记09(雨水水坑着色器/完整雨水着色器)

一.雨水水坑着色器 要用到这样一个噪声贴图&#xff0c;我们要做的就是&#xff0c;做出水坑并让水坑在这种浑浊的噪点中产生&#xff0c;因此水坑将从最暗的斑点生长&#xff0c;然后随着它继续占据越来越亮的像素而生长 现在水坑将从上到下投射到世界空间中&#xff0c;所以…

macOS下的文件系统权限问题:从“Read-only”错误到解决实践20241019

macOS下的文件系统权限问题&#xff1a;从“Read-only”错误到解决实践 在 macOS 系统开发和运维的过程中&#xff0c;文件系统的权限问题是程序员常遇到的棘手问题之一。尤其是当你尝试在命令行中克隆 Git 仓库时&#xff0c;突然冒出的“Read-only file system”错误往往让人…