【设计模式--结构型--桥接模式】

设计模式--结构型--桥接模式

    • 桥接(Bridge)模式
      • 定义
      • 结构
      • 案例
      • 好处
      • 使用场景

桥接(Bridge)模式

定义

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

结构

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

案例

需要开发一个跨平台视频播放器,可以在不同操作系统平台(windows,mac, linux等)上播放多种格式(rmvb,avi,wmv等)的视频文件,该播放器包含了两个维度,可以使用桥接模式
类图:
在这里插入图片描述

/*** 视频文件 实现化角色*/
public interface VideoFile {// 解码方法void decode(String fileName);
}
/*** avi 视频文件  具体的实现化角色*/
public class AviFile implements VideoFile{//@Overridepublic void decode(String fileName) {System.out.println("avi视频文件:"+ fileName);}
}
/*** Rmvb视频文件  具体的实现化角色*/
public class RmvbFile implements VideoFile {@Overridepublic void decode(String fileName) {System.out.println("rmvb视频文件:" + fileName);}
}
/*** 抽象的操作系统类  抽象化角色*/
public abstract class OpratingSystem {// 声明videoFile角色protected VideoFile videoFile;public OpratingSystem(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName);
}
/*** 扩展抽象化角色  Windows操作系统*/
public class Windows extends OpratingSystem{public Windows(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}
public class Mac extends OpratingSystem{public Mac(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}
public class Test01 {public static void main(String[] args) {// 创建mac系统对象OpratingSystem system = new Mac(new AviFile());// 使用操作系统播放视频文件system.play("西游记");OpratingSystem system1 = new Windows(new RmvbFile());system1.play("三国演义");}
}

在这里插入图片描述

好处

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

使用场景

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

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

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

相关文章

达梦 DM 数据库

达梦数据库 varchar varchar2的区别, 推荐使用 varchar2 -- 日期格式化 SELECT DATE_FORMAT(GETDATE(), %Y-%m-%d %H:%i:%s);-- 2023-12-11 SELECT CURDATE();-- 2023-12-11 09:22:24 SELECT SYSDATE();-- 2023-12-11 11:09:53.136527 SELECT GETDATE();-- 当前日期1 -1天 SEL…

MyEclipse中常用的快捷键大全

Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。 1. 【ALT/】 此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁…

vite+vue3实现动态路由

在做这个动态路由的时候踩了很多坑,其中大部分是粗心了 动态菜单主要是导入的方式 import.meta.glob 参考:功能 | Vite 官方中文文档 1、多层路由渲染(用3层路由做demo) 拿到接口的数据是后台直接处理好的结构,但是…

Lua脚本操作redis

模拟库存扣减 基础版 SpringBootTest class LuaTests {Resource(name"redisTemplate")ValueOperations<String,Long> valueOperations;AutowiredStringRedisTemplate stringRedisTemplate;final String priductKey "product.1";Testvoid test1()…

Java NIO, IO 整理

NIO: IO多路复用: 参考: Redis&#xff08;六&#xff09;单线程I/O多路复用模型浅析_单线程多路复用-CSDN博客 Java NIO 详解_java nio详解_开发菜鸡的博客-CSDN博客 Java Socket 之 NIO - 掘金 答应我&#xff0c;这次搞懂 I/O 多路复用&#xff01;_小林coding的博客-CS…

Spring JdbcTemplate

一、简介 Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作。它是 spring 框架中提供的一个对象&#xff0c;是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多的操作模板类。 针对操作关系型数据&#xff1a; jdbcTemplateHibe…

A* 算法简介

一、A* 算法简介A* algorithm is a popular choice for graph search. Breadth First Search is the simplest of the graph search algorithms. Graph search algorithms, including A*, take a “graph” as input. A* algorithm is a modification of Dijkstra’s Algorithm…

华为OD机试 - 部门人力分配(Java JS Python C)

题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。 目前要求每个月最多有2个…

在k8s中部署nfs-client-provisioner

1、部署过程 1.1、环境依赖 在部署nfs-client-provisioner之前&#xff0c;需要先部署nfs服务。 因为&#xff0c;nfs-client-provisioner创建的pv都是要在nfs服务器中搭建的。 本示例中的nfs server的地址如下&#xff1a; [rootnode1 /]# showmount -e Export list for …

pinia 持久化插件使用

官方文档 本文主要介绍 vue3组合式 api 使用持久化插件的写法。 选项式 写法官方已给出 安装依赖 pnpm i pinia-plugin-persistedstate插件的使用 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…

JavaMap工具类(MapUtils)

1、Object转Map 2、将 map 中的 value 为null的的元素转成空字符串"" 3、map转Object 4、MAP 判空 5、Map 排序 按key值长度进行排序 6、两个MAP对比&#xff0c;在oldMap中移除remMap中所有的key值 备注&#xff1a;排序的话(TreeMap)是可以直接实现简单排序的…

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…

Java:commons-lang3中的StringUtils.strip实现移除字符串首尾字符

依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency>示例 // 包名 import org.apache.commons.lang3.StringUtils;// 处理字符串&…

kafka支持外网访问

kafka支持外网访问 1.kafka正常部署之后如果不修改&#xff0c;外网是无法访问的&#xff0c;具体如下&#xff08;这里是单节点&#xff09; 2.这个时候需要修改kafka的config中的server.properties中的 listeners 修改为0.0.0.0 监控所有网卡&#xff0c;advertised.listene…

管理空闲存储空间

位示图是操作系统中一种管理空闲存储空间的方法。管理空闲除使用位示图法还可用&#xff1a;空闲区表法&#xff0c;空闲链表法&#xff0c;成组链接法 1.空闲区表法 空闲表法属于连续分配方法。它与内存管理中的动态分区分配方法雷同。 将外存空间上一个连续未分配区域称为“…

[三次反转法]循环移动数组元素

循环移动 题目描述 给定一组整数&#xff0c;要求利用数组把这组数保存起来&#xff0c;然后实现对数组的循环移动。假定供有n个整数&#xff0c;则要使前面各数顺序向后移m个位置&#xff0c;并使最后m个数变为最前面的m个数(m<n)。 注意&#xff0c;不要用先输出后m个数…

口袋参谋:如何对订单实现一键批量插旗?

​在淘宝店铺运营中&#xff0c;对宝贝订单标注插旗&#xff0c;也算是常态了&#xff0c;至少90%的商家都不陌生&#xff0c;剩下的10%是刚入行的新手&#xff0c;正如我刚入行一样。 01 首先我们要了解什么是插旗&#xff1f; 其实就是淘宝店铺利用各种颜色的旗子来代表订单…

A-23 P离子交换树脂:高效去除无机有机污染物的新选择

在当今水处理行业中&#xff0c;高效、环保的离子交换树脂备受关注。本文将为您介绍一款具有卓越性能的碱性季胺基阴离子交换树脂——Tulsion A-23 P。通过分析其特性和应用&#xff0c;展示其在水处理领域的优势。 一、Tulsion A-23 P离子交换树脂的特性 物理化学稳定性&#…

Vue生命周期函数执行顺序(使用注意事项)

文章目录 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Vue.js 是一个基于 MVVM 模式的前端框架&#xff0c;它的核心是一个响应式的数据绑定系统。在 Vue.js 中&#xff0c;组件是一个可复用的 Vue 实例&#xff0c;它拥有自己的生命周期…

input聚焦,失去焦点的那些事

需求&#xff1a; 1&#xff1a;搜索输入时显示清空按钮和搜索按钮&#xff1b; 2&#xff1a;点击搜索按钮失去焦点&#xff0c;并查询&#xff1b; 3&#xff1a;点击清空按钮后重新聚焦&#xff1b; 需要解决的问题&#xff1a; 1&#xff1a;失去焦点需要别的处理的话要加…