Java 设计模式——桥接模式

目录

  • 1.概述
  • 2.结构
  • 3.实现
    • 3.1.实现化类
    • 3.2.具体实现化类
    • 3.3.抽象化类
    • 3.4.扩展抽象化类
    • 3.5.测试
  • 4.优缺点
  • 5.使用场景

1.概述

(1)现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:
在这里插入图片描述

我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。

(2)桥接模式 (Bridge Pattern) 是一种结构型模式,它用于将抽象部分与实现部分分离,使它们可以独立变化。桥接模式通过组合多个接口,允许一个类的功能在另一个类中进行实现,从而使得两个类可以独立地变化而互不影响。

2.结构

桥接模式包含以下主要角色:

  • 抽象化 (Abstraction) 角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化 (Refined Abstraction) 角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化 (Implementor) 角色:定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化 (Concrete Implementor) 角色:给出实现化角色接口的具体实现。

3.实现

【例】视频播放器:需要开发一个跨平台视频播放器,可以在不同操作系统平台(如 Windows、Mac、Linux 等)上播放多种格式的视频文件,常见的视频格式包括 RMVB、AVI、WMV 等。该播放器包含了两个维度,适合使用桥接模式。类图如下:

在这里插入图片描述

代码如下:

3.1.实现化类

VideoFile.java

//视频文件
public interface VideoFile {//解码功能void decode(String fileName);
}

3.2.具体实现化类

AviFile.java

//avi视频文件
public class AviFile implements VideoFile{@Overridepublic void decode(String fileName) {System.out.println("avi视频文件:" + fileName);}
}

RmvbFile.java

//rmvb视频文件(具体的是实现化角色)
public class RmvbFile implements VideoFile{@Overridepublic void decode(String fileName) {System.out.println("rmvb视频文件:" + fileName);}
}

3.3.抽象化类

OperatingSystem.java

//抽象的操作系统类
public abstract class OperatingSystem {//声明VideoFile变量protected VideoFile videoFile;public OperatingSystem(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileNamw);
}

3.4.扩展抽象化类

Mac.java

// Mac 操作系统
public class Mac extends OperatingSystem{public Mac(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}

Windows.java

// windows 操作系统
public class Windows extends OperatingSystem {public Windows(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}

3.5.测试

Client.java

public class Client {public static void main(String[] args) {//创建 Mac 系统对象OperatingSystem system = new Mac(new AviFile());//使用操作系统播放视频文件system.play("战狼2");}
}

输出结果如下:

avi视频文件:战狼2

从上面的代码可以看出桥接模式的一些优点:

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。如:如果现在还有一种视频文件类型 wmv,我们只需要再定义一个类实现 VideoFile 接口即可,其他类不需要发生变化。
  • 实现细节对客户透明。

4.优缺点

(1)桥接模式的优点包括:

  • 分离抽象和实现:桥接模式可以将抽象部分和实现部分分离,使它们可以独立地变化。这样一来,系统更加灵活,能够方便地进行扩展和维护。
  • 桥接模式提高了系统的可扩展性,因为可以通过增加新的抽象和实现来扩展系统的功能。
  • 桥接模式提供了良好的结构性设计,使得系统更加清晰、易于理解和维护。

(2)桥接模式的缺点包括:

  • 增加复杂度:引入桥接模式会增加系统中的类和对象数量,可能会导致系统更加复杂。
  • 不易理解:对于初学者来说,理解桥接模式可能需要一定的时间和经验。

5.使用场景

(1)桥接模式通常适用于以下场景:

  • 当一个类存在多个独立变化的维度,且希望在抽象部分和实现部分之间增加灵活性时,可以考虑使用桥接模式。例如,对于不同品牌的手机(抽象部分)和不同操作系统的软件(实现部分),可以使用桥接模式将它们解耦,实现各自独立地变化。
  • 当一个类需要在多个维度上进行扩展,而子类的扩展可能会导致组合爆炸时,可以考虑使用桥接模式。通过桥接模式,可以避免创建大量的子类,而是通过组合的方式来实现不同的组合效果。
  • 当希望在抽象部分和实现部分之间建立一个稳定的连接关系,且希望二者可以独立地进行扩展和变化时,可以考虑使用桥接模式。这样可以使得系统更加灵活,易于维护和扩展。

(2)总的来说,桥接模式适用于抽象和实现有多个变化维度的情况,能够有效地解耦系统中的各个部分,提高系统的灵活性和可维护性。

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

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

相关文章

数据结构与算法之美学习笔记:22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

目录 前言应用五:负载均衡应用六:数据分片应用七:分布式存储解答开篇 & 内容小结 前言 本节课程思维导图 今天,我们再来看剩余三种应用:负载均衡、数据分片、分布式存储。你可能已经发现,这三个应用都…

详解Java设计模式之职责链模式

原文:详解Java设计模式之职责链模式_java_脚本之家 责任链模式是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下 − 目…

直播美颜SDK对比评测:技术原理与应用实践

直播行业蓬勃发展,其中,美颜滤镜技术在直播中扮演着至关重要的角色。本文将深入探讨不同直播美颜SDK的技术原理,并通过对比评测它们在实际应用中的表现,以揭示各SDK的优劣之处。 一、背景 随着直播技术的不断进步,直…

虚幻C++ day5

角色状态的常见机制 创建角色状态设置到UI上 在MainPlayer.h中新建血量,最大血量,耐力,最大耐力,金币变量,作为角色的状态 //主角状态UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "Playe Stats&…

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工水母优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

Network(三)动态路由与ACL配置

一 三层交换机 1 三层交换机概述 三层交换二层交换三层转发 2 虚拟接口概述 在三层交换机上配置的VLAN接口为虚拟接口,使用Vlanif(VLAN虚拟接口)实现VLAN间路由,VLAN接口的引入使得应用更加灵活 三层交换机VLAN间通信的转发…

vue3+vite+SQL.js 读取db3文件数据

前言:好久没写博客了,最近一直在忙,没时间梳理。最近遇到一个需求是读取本地SQLite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。 1.pnpm下载SQL.js(什么都可以下)…

力扣每日一题-数位和相等数对的最大和-2023.11.18

力扣每日一题:数位和相等数对的最大和 开篇 这道每日一题还是挺需要思考的,我绕晕了好久,根据题解的提示才写出来。 题目链接:2342.数位和相等数对的最大和 题目描述 代码思路 1.创建一个数组存储每个数位的数的最大值,创建一…

软件项目测试指南

软件测试是保证软件产品质量的重要手段之一。它是测量、评估软件产品特点和能力的活动。现在,国内一些软件企业对于软件测试的重视程度还很不够,认为测试工作非常简单,只是简单地操作所测的软件产品而已。这种错误的思想严重影响了国内软件质…

Evil靶场

Evil 1.主机发现 使用命令探测存活主机,80.139是kali的地址,所以靶机地址就是80.134 fping -gaq 192.168.80.0/242.端口扫描 开放80,22端口 nmap -Pn -sV -p- -A 192.168.80.1343.信息收集 访问web界面 路径扫描 gobuster dir -u http…

【C++上层应用】2. 预处理器

文章目录 【 1. #define 预处理 】【 2. #ifdef、#if 条件编译 】2.1 #ifdef2.2 #if2.3 实例 【 3. # 和 ## 预处理 】3.1 # 替换预处理3.2 ## 连接预处理 【 4. 预定义宏 】 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是…

SpringBoot2—运维实用篇

目录 打包与运行 • 程序打包与运行(Windows版) • 程序运行(Linux版) 配置高级 • 临时属性设置 • 配置文件分类 • 自定义配置文件 多环境开发 多环境开发(yaml单一文件版) 多环境开发&am…

碰到一个逆天表中表数据渲染

1. 逆天表中表数据问题 我有一个antd-table组件,他的编辑可以打开一个编辑弹窗打开弹窗里面还会有一个表格,如果这个表格的column是在外层js文件中保存的话,那么第一次打开会正常渲染数据,再次打开就不会渲染,即使是已…

SQL单表复杂查询where、group by、order by、limit

1.1SQL查询代码如下&#xff1a; select job as 工作类别,count(job) as 人数 from tb_emp where entrydate <2015-01-01 group by job having count(job) > 2 order by count(job) limit 1,1where entrydate <‘2015-01-01’ 表示查询日期小于2015-01-01的记录…

【Leetcode合集】2342. 数位和相等数对的最大和

文章目录 2342. 数位和相等数对的最大和方案1方案2方案3方案4 2342. 数位和相等数对的最大和 2342. 数位和相等数对的最大和 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给你一个下标从 0 开始的数组 nu…

Git安装与常用命令

Git简介&#xff1a; Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。Git与常用的版本控制工具CVS、Subversion等不同&#xff0c;它采用了分布式…

动态改标题

<el-dialog :title"showTitle" :visible"showDialog" close"close"> </el-dialog>使用计算属性 computed: {showTitle() {//这里根据点击的是否有具体点击的那个id来判断return this.form.id ? "编辑部门" : "新增部…

Virtual安装centos后,xshell连接centos 测试及遇到的坑

首先来一张官方的图--各种网络模式对应的连接状况&#xff1a; 1. 网络使用Host-Only模式动态分配IP&#xff0c;点确定后&#xff0c;centos 上运行 system restart network &#xff0c;使用ifconfig查看新的ip&#xff0c;XShell可以直接连上centos&#xff0c; 但是由于使用…

【总结】坐标变换和过渡矩阵(易忘记)

xCy&#xff0c;此为x到y的坐标变换。 [β1,β2,…,βn] [α1,α2,…αn]C&#xff0c;此为基α到基β的过渡矩阵。 这个概念经常忘记。。。alpha到beta看来就是alpha后面加一个过渡矩阵了&#xff0c;很直观。坐标变换就是根据过渡矩阵和基本形式推一推得到吧&#xff0c;记…

大型 APP 的性能优化思路

做客户端开发都基本都做过性能优化&#xff0c;比如提升自己所负责的业务的速度或流畅性&#xff0c;优化内存占用等等。但是大部分开发者所做的性能优化可能都是针对中小型 APP 的&#xff0c;大型 APP 的性能优化经验并不会太多&#xff0c;毕竟大型 APP 就只有那么几个&…