当前位置: 首页 > news >正文

Android设计模式--桥接模式

闻正言,行正道,左右前后皆正人

一,定义

将抽象部分与实现部分分离,使它们都可以独立地进行变化

二,使用场景

从模式的定义中,我们大致可以了解到,这里的桥接的作用其实就是连接抽象部分与实现部分,但事实上,任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦。

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免 在两个层次之间建立静态的继承联系,可以通过桥接模式使它们在抽象层建立一个关联关系。

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模式。

一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

三,角色介绍

1,Abstraction 抽象部分

该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类。

2,RefinedAbstraction 优化的抽象部分

抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展。

3,Implementor 实现部分

可以为接口或抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分这些基本操作的业务方法。

4,ConcreteImplementor 实现部分的具体实现

完善 实现部分中方法定义的具体逻辑

5,Client 客户端调用

四,使用案例

假如我们的笔记本工厂有联想i5,联想i7,联想i9,华硕i5,华硕i7,华硕i9这些类型的电脑生产。那么对于笔记本电脑来说,实质上就两种变化,联想和华硕、i5,i7,i9

那么我们就将品牌定义为抽象部分,cpu型号定义为实现部分。因为它们是两个维度的变化,当然也可以反过来定义。

首先定义实现部分,生产不同的CPU

public interface CPU {void makeCPU();
}

然后具体实现不同的CPU型号:

public class I5cPU implements CPU{@Overridepublic void makeCPU() {System.out.println("生产i5Cpu");}
}
public class I7Cpu implements CPU{@Overridepublic void makeCPU() {System.out.println("生产i7Cpu");}
}
public class I9Cpu implements CPU{@Overridepublic void makeCPU() {System.out.println("生产i9Cpu");}
}

 然后定义抽象部分,持有实现部分CPU的引用 ,生产不同品牌的电脑:

/*** 抽象部分  笔记本电脑* */
public abstract class NoteBook {protected CPU cpu;public NoteBook(CPU cpu) {this.cpu = cpu;}/**** */public abstract void makeComputer();}

然后是RefinedAbstraction 优化的抽象部分,实现不同品牌的电脑:

public class LenovoNoteBook extends NoteBook{public LenovoNoteBook(CPU cpu) {super(cpu);}@Overridepublic void makeComputer() {System.out.println("生产联想电脑");cpu.makeCPU();}
}
public class AsusNoteBook extends NoteBook{public AsusNoteBook(CPU cpu) {super(cpu);}@Overridepublic void makeComputer() {System.out.println("生产华硕笔记本电脑");cpu.makeCPU();}
}

最后是在client使用:

I5cPU i5cPU =new I5cPU();
I7Cpu i7Cpu =new I7Cpu();
I9Cpu i9Cpu =new I9Cpu();
//联想i5
LenovoNoteBook lenovoNoteBook1 =new LenovoNoteBook(i5cPU);
lenovoNoteBook1.makeComputer();
//联想i7
LenovoNoteBook lenovoNoteBook2 =new LenovoNoteBook(i7Cpu);
lenovoNoteBook2.makeComputer();
//联想i9
LenovoNoteBook lenovoNoteBook3 =new LenovoNoteBook(i9Cpu);
lenovoNoteBook3.makeComputer();
//华硕i5
AsusNoteBook asusNoteBook1 =new AsusNoteBook(i5cPU);
asusNoteBook1.makeComputer();
//华硕i7
AsusNoteBook asusNoteBook2 =new AsusNoteBook(i7Cpu);
asusNoteBook2.makeComputer();
//华硕i9
AsusNoteBook asusNoteBook3 =new AsusNoteBook(i9Cpu);
asusNoteBook3.makeComputer();

输出结果:

 

如果 我们想再增加 一个惠普品牌的笔记本电脑,那么只需要新建一个类 实现抽象部分即可:

 

public class HPNoteBook extends NoteBook{public HPNoteBook(CPU cpu) {super(cpu);}@Overridepublic void makeComputer() {System.out.println("生产惠普笔记本电脑");}
}

在客户端使用:

 

//惠普i5
HPNoteBook hpNoteBook1 =new HPNoteBook(i5cPU);
hpNoteBook1.makeComputer();
//惠普i7
HPNoteBook hpNoteBook2 =new HPNoteBook(i7Cpu);
hpNoteBook2.makeComputer();
//惠普i9
HPNoteBook hpNoteBook3 =new HPNoteBook(i9Cpu);
hpNoteBook3.makeComputer();

同样的如果 我们要增加实现部分CPU型号,比如要增加i3,也是直接新建 类就可以。

五,总结

桥接模式可以应用到许多开发中,但是它应用的却不多,一个很重要的原因是对于抽象与实现的分离把握,是不是需要分离,如何分离?对设计者来说要有一个恰倒好处的分寸。不管怎么说,桥接模式的优点我们毋庸置疑,分离抽线与实现,灵活的扩展以及对客户来说透明的实现等。但是使用桥接模式也有一个不明显的缺点,上面我们也提到了,就是不容易设计,对开发者来说要有一定的经验要求,因此,对桥接模式应用来说,理解很简单,设计却不容易。

参考文献:Android源码设计模式解析与实战

相关文章:

Android设计模式--桥接模式

闻正言,行正道,左右前后皆正人 一,定义 将抽象部分与实现部分分离,使它们都可以独立地进行变化 二,使用场景 从模式的定义中,我们大致可以了解到,这里的桥接的作用其实就是连接抽象部分与实现…...

1、分布式锁实现原理与最佳实践(一)

在单体的应用开发场景中涉及并发同步时,大家往往采用Synchronized(同步)或同一个JVM内Lock机制来解决多线程间的同步问题。而在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题&…...

Autosar通信实战系列03-NM模块要点及其配置介绍

本文框架 前言1. NM模块要点介绍1.1 NM基本功能介绍1.2 NM协同功能介绍2. NM配置2.1 NmGlobalConfig配置2.2 NmChannelConfigs配置前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑分析,调测试方法及典型问…...

Golang模块管理功能

文章目录 1. Golang 包管理1.1 GOPATH 包管理1.2 Go vendor 包管理1.3 Go modules包管理2. Go Modules 应用实践2.1 Go modules关键信息2.1.1 go mod 命令行2.1.2 配置代理服务2.2 创建项目2.3 获取依赖包2.4 运行项目1. Golang 包管理 1.1 GOPATH 包管理 第一阶段: Golang初…...

从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读

🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1:文本数据预处理 从零构建属于自己的GPT系列2:语…...

scipy 笔记:scipy.spatial.distance

1 pdist 计算n维空间中观测点之间的成对距离。 scipy.spatial.distance.pdist(X, metriceuclidean, *, outNone, **kwargs) 1.1 主要参数 X一个m行n列的数组,表示n维空间中的m个原始观测点metric使用的距离度量out输出数组。如果非空,压缩的距离矩阵…...

java video audio encoder

引言 在现代互联网的时代,视频和音频已经成为人们生活中不可或缺的一部分。而在计算机科学中,视频和音频编码器则是将原始的视频和音频数据转换为可压缩格式的关键技术。在本文中,我们将探讨基于Java的视频和音频编码器的使用。 什么是视频…...

TypeScript 中声明类型的方法

1、使用:运算符来为变量和函数参数指定类型。例如: let num: number 5; function add(a: number, b: number): number {return a b; }2、使用 type 关键字来声明自定义类型别名。例如: type Point {x: number;y: number; };3、使用 interface 关键字…...

显示器校准软件BetterDisplay Pro mac中文版介绍

BetterDisplay Pro mac是一款显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 BetterDisplay Pro mac软件特点 - 显示器校准:可以根据不同的需求和环境条件调整显示器的颜色、亮度和对比度等参数…...

Element UI 走马灯 实现鼠标滚动切换页面

鼠标滚动切换页面 elementui Carousel 走马灯鼠标滚轮事件实现 一、在轮播图外的盒子外添加鼠标滚轮事件,触发GoWheel函数。 wheel"goWheel"二、通过判断deltaY的数值来触发相应事件 它检查滚轮事件的deltaY属性是否大于0 event.deltaY当鼠标滚轮向下…...

在Docker上部署Springboot项目

在Docker上部署Springboot项目 ###1.安装docker 2.安装mysql 拉 Mysql 镜像 docker pull mysql:5.7.31运行 Mysql 5.7.31 第一次运行需要设置密码 docker run -d --name myMysql -p 9506:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD1234 mysql:5.7.31不是…...

2024中国眼博会,全国眼康与眼镜品牌加盟展会,北京眼健康展

立足北京,面向全球,2024第六届CEYEE中国眼博会,将以大规模的展览面积在4月与您相会; ——春天是万物复苏的季节,更是企业开拓市场,抓住春季发展机遇的重要时节;第六届CEYEE中国眼博会将在2024年…...

C++学习 --谓词

目录 1, 什么是谓词 1-1, 一元谓词 1-2, 二元谓词 1, 什么是谓词 返回bool类型的仿函数, 叫着谓词, 分为一元谓词和二元谓词 1-1, 一元谓词 operator()接收一个参数,叫着一元谓…...

Arkts深入了解运用 LazyForEach【鸿蒙专栏-17】

文章目录 深入了解 LazyForEach:数据懒加载LazyForEach概述接口描述IDataSource接口DataChangeListener接口使用限制和注意事项键值生成规则和组件创建规则首次渲染键值相同时错误渲染键值生成规则和组件创建规则首次渲染键值相同时错误渲染键值生成规则和组件创建规则首次渲染…...

如何让你的 Jmeter+Ant 测试报告更具吸引力?

引言 想象一下,你辛苦搭建了一个复杂的网站,投入了大量的时间和精力进行开发和测试。当你终于完成了测试并准备生成测试报告时,你可能会发现这个过程相当乏味,而对于其他人来说,它可能也不那么吸引人。 但是&#xf…...

游戏APP接入哪些广告类型

当谈到游戏应用程序(APP)接入广告时,选择适合用户体验和盈利的广告类型至关重要。游戏开发者通常考虑以下几种广告类型: admaoyan猫眼聚合 横幅广告: 这些广告以横幅形式显示在游戏界面的顶部或底部。它们不会打断游戏…...

Echarts地图registerMap使用的GeoJson数据获取

https://datav.aliyun.com/portal/school/atlas/area_selector 可以选择省,市,区。 也可以直接在地图上点击对应区域。 我的应用场景 我这里用到这个还是一个特别老的大屏项目,用的jq写的。显示中国地图边界区域 我们在上面的这个地区选择…...

【JavaEE】Java中的多线程 (Thread类)

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...

python中具名元组的使用

collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类。 from collections import namedtuple City namedtuple(City2, name country population coordinates) tokyo City(Tokyo, JP, 36.933, (35.689722, 139.691667)) pr…...

【开题报告】基于SpringBoot的婚纱店试妆预约平台的设计与实现

1.选题背景 婚礼是人生中的重要时刻,而试妆是婚礼准备过程中不可或缺的一环。传统的婚纱店试妆预约方式通常需要亲自到店或通过电话预约,这样的方式可能存在一些问题。首先,用户需要花费时间和精力到店进行预约,对于忙碌的现代人…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...