【Java设计模式】九、桥接模式

文章目录

  • 0、背景
  • 1、模式
  • 2、案例
  • 3、使用场景

0、背景

现要创建不同的图形,图形的形状有圆、长方形、正方形,且它们有不同的颜色
在这里插入图片描述
两个维度在变,使用类的继承可以实现,也符合开闭原则,但会类爆炸。

1、模式

将抽象与实现分离,使它们可以独立变化,用组合代替继承,将两部分连接起来。主要包括以下角色:

  • 抽象化角色:抽象类,聚合实现化角色
  • 扩展抽象化角色:抽象化角色的子类,通过组合关系调用实现化角色中的业务方法
  • 实现化角色:定义接口与方法,供扩展抽象化角色调用
  • 具体实现化角色:实现化角色中方法的具体实现

2、案例

开发一个跨操作系统的视频播放器,操作系统要支持Windows和Mac,视频格式要支持AVI和RMVB格式。这是两个维度的变化,可用桥接模式。

在这里插入图片描述

定义视频文件类(实现化角色)

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

写视频文件的实现类(具体的实现化角色)

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

//rmvb文件
public class REVBBFile implements VideoFile {

    public void decode(String fileName) {
        System.out.println("rmvb文件:" + fileName);
    }
}

定义抽象操作系统类(抽象化角色),聚合实现化角色

//操作系统版本
public abstract class OperatingSystemVersion {

    protected VideoFile videoFile;  //聚合实现化角色

    public OperatingSystemVersion(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    public abstract void play(String fileName);  //播放视频文件的方法
}

写扩展抽象化角色:

//Windows版本
public class Windows extends OperatingSystem {

    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}

//mac版本
public class Mac extends OperatingSystemVersion {

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
		videoFile.decode(fileName);
    }
}

测试:

//测试类
public class Client {
    public static void main(String[] args) {
        OperatingSystem os = new Windows(new AVIFile());
        os.play("电影.avi");
    }
}

3、使用场景

  • 一个类存在两个独立变化的维度,且这两个维度都需要扩展
  • 避免两个层次之间建立静态的继承联系,可用桥接模式来建立一个关联关系

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是高级编程语言?——跟老吕学Python编程

什么是高级编程语言?——跟老吕学Python编程 高级编程语言简介高级编程语言发展历程高级编程语言特点高级编程语言分类命令式语言函数式语言逻辑式语言面向对象语言 常见的高级编程语言及其特点和应用领域高级编程语言性能分析高级编程语言的工作方式 高级编程语言简…

【框架设计】MVC和MVVM对比图

1. MVC(Model-View-Controller) 单向通信View和Model通过Controller承上启下 2. MVVM(Model-View-ViewModel) 数据绑定M -> VM -> V DOM事件监听 V -> VM -> M 1. MVC是单向的,MVVM是双向的,…

服务器主机云主机在日常维护需要注意的几个点

服务器的日常维护对于确保服务器的稳定运行和安全性非常重要,以下是一些常见的服务器日常维护方面: 定期更新操作系统和软件:确保服务器的操作系统、应用程序以及安全补丁都是最新的,以填补已知的安全漏洞和提高系统性能。监视服务…

Stable Diffusion 详解

整体目标 文本生成图片;文本图片生成图片 网络结构 CLIP的文本编码器和图片生成器组成图像生成器,输入是噪声经过UNet得到图像特征,最后解码得到图像 前向扩散 模型直接预测图片难度比较大,所有让模型预测噪音然后输入-噪音…

MaxEnt模型与R语言结合:物种分布模拟的案例分析

在生态学研究中,物种分布模拟是一项至关重要的任务。它有助于我们理解物种与环境之间的复杂关系,预测物种在气候变化或人类活动影响下的潜在分布变化。近年来,随着计算机技术的不断发展,基于机器学习的物种分布模拟方法逐渐成为研…

用了一个select框出现的问题许多问题差不多搞了一个多小时最后还是百度解决了,百度伟大

问题出现 问题描述 select 多选框里的数据问题,我讲获取的数据信息放入框ref(null) 中,将数据返回到返回框里,一直发现存在问题,不能正常显示,百度里一下,发现没有百度到其他问题,最后换了一种…

【SpringCloud微服务实战02】Ribbon 负载均衡

Ribbon使用 Eureka中已经集成了Ribbon,无需额外引入,通过 @LoadBalanced 注解在请求中使用 Ribbon 负载均衡: @Bean @LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate(); } Ribbon工作流程图 Ribbon负载均衡策略 修改Ribbon负载均衡策略 方式一…

【python】time库知识整理

简介 python的time库是python内置库,主要负责处理与时间相关的事务。 获取当前时间 函数作用time()获取当前时间戳ctime()获取字符串形式的时间gmtime()调用内部方法,赋予属性,能够被程序调用执行 time返回的是时间戳 ctime是返回的我们…

【网络】数据在同网段和跨网段通信流程

情景一&#xff1a;同一广播域内&#xff0c;两台主机通信过程&#xff1a; 当NO要和N1通信时&#xff0c;假如N0知道N1的IP但却不知道它的MAC地址&#xff0c;那NO就会发送一个ARP的广播请求<1>&#xff08;里面源IP是NO 目标IP是N1 源MAC是N0 目标MAC是12个F&#xff0…

【仿真总结】基于matlab的传递函数计算与绘图

前言 在DC-DC电路控制算法中&#xff0c;PID控制是最常见且实用的&#xff0c;但实现前提有二&#xff0c;一是需要手算电路传递函数&#xff0c;二是需要将实际电路元件数值代入计算&#xff0c;第一步无法避免&#xff0c;但是在进行第二步时&#xff0c;存在大量基础、细致的…

使用Amazon Bedrock托管的Claude3 学习中国历史

最近被Amazon Bedrock托管的Claude3 刷屏了&#xff0c;那么先简单介绍下什么是Claude 3。 Claude 3是Anthropic 推出了下一代 Claude模型&#xff0c;针对不同用例进行优化的三种先进模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus&#xff0c;使用户能够…

Python速度大比拼:与主流编程语言的速度对决

在评估用于具体业务的编程语言时&#xff0c;经常考虑的一个关键指标之一是执行速度。Python以其简单性和可读性而闻名&#xff0c;但有时却因其性能而受到质疑。在这个领域&#xff0c;我们需要深入比较分析Python在执行速度方面与其他流行的编程语言相比的情况。 程语言执行速…

遥感与ChatGPT:科研中的强强联合

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到各个领域&#xff0c;为传统行业带来了前所未有的变革。其中&#xff0c;遥感技术作为观测和解析地球的重要手段&#xff0c;正逐渐与AI技术相结合&#xff0c;为地球科学研究与应用提供了全新的…

金蝶天燕 AMDC 替代redis

上传控制台文件到linux opt目录 解压安装包 tar -zxvf amdc_console_release_v2_x86_64.tar.gz 进入解压后的文件夹 cd amdc-console .执行启动命令 nohup ./amdc-console >nohup.out 2>&1 & 地址访问 http://ip:9001 三员管理中的三员初始密码 三员分别指&…

day16_Set_Map

今日内容 零、 复习昨日 一、Set 二、Map 零、 复习昨日 集合特点 长度不固定存储的数据类型不限制有丰富api方法可以调用有些有序,无序,或者有些允许重复有些会去重 集合体系图List 集合, 规定了所存储的元素 有序且允许重复常用的ArrayList 底层是数组,初始容量10存满后扩容,…

LLM 技术图谱(LLM Tech Map) Kubernetes (K8s) 与AIGC的结合应用

文章目录 1、简介2、基础设施3、大模型3、AI Agent&#xff08;LLM Agent&#xff09;4、AI 编程5、工具和平台6、算力7、Kubernetes (K8s) 与人工智能生成内容 (AIGC) 的结合应用7.1、摘要7.2、介绍7.3、K8s 与 AIGC 的结合应用7.4、实践案例7.5、结论 1、简介 LLM 技术图谱&…

Elastic Stack--05--聚合、映射mapping

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.聚合(aggregations)基本概念桶&#xff08;bucket&#xff09;度量&#xff08;metrics&#xff09; 案例 11. 接下来按price字段进行分组&#xff1a;2. 若想对所…

C语言:预处理详解(知识点和代码演示)

和黛玉学编程........> 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义 比如&#xff1a; #define定义常量 #def…

Visual Studio2022使用(后续使用到再更新)

安装 从官网安装&#xff0c;下载即可。注意&#xff1a;选择社区版。&#xff08;免费够用&#xff09; 安装好后打开安装包&#xff0c;会继续下载东西&#xff0c;挂几个小时差不多就下好了。 使用 1、打开VS&#xff0c;点击“创建新项目”&#xff0c;选择“空项目”。…

【图论】 【割点】 【双连通分类】LCP 54. 夺回据点

本文涉及知识点 图论 割点 双连通分类 割点原理及封装好的割点类 LeetCode LCP 54. 夺回据点 魔物了占领若干据点&#xff0c;这些据点被若干条道路相连接&#xff0c;roads[i] [x, y] 表示编号 x、y 的两个据点通过一条道路连接。 现在勇者要将按照以下原则将这些据点逐一…