23种设计模式-桥接模式(安卓应用场景介绍)
概念
桥接模式是一种结构型设计模式,它通过将抽象与其实现分离来解耦。它使用接口(抽象类)作为桥梁,将一个抽象类与其实现类的代码分别独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”。
示例
为了更好地理解桥接模式,我们来看一个简单的示例:假设有一个形状类,其中有一个颜色属性。此时,如果我们使用继承来实现不同颜色的形状类,就需要创建许多子类,使代码结构变得复杂且难以维护。而使用桥接模式,则可以将形状和颜色分别抽象出来,从而将它们独立开来。
下面是一个简单的代码示例:
public interface Color {String getColor();
}public class Red implements Color {@Overridepublic String getColor() {return "红色";}
}public class Blue implements Color {@Overridepublic String getColor() {return "蓝色";}
}public abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}public abstract void draw();
}public class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("绘制一个" + color.getColor() + "的矩形");}
}public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("绘制一个" + color.getColor() + "的圆形");}
}
在上面的代码中,我们首先定义了一个颜色接口,并分别实现了红色和蓝色。然后,我们定义了一个抽象的形状类,其中有一个颜色属性和一个抽象方法draw()。最后,我们实现了具体的矩形和圆形类,并在构造函数中传入了一个颜色对象。
这样,我们就将形状和颜色分别抽象出来,从而实现了解耦。当我们需要创建不同颜色的形状时,只需要创建不同颜色的对象并传入即可。
Android应用
在Android应用开发中,桥接模式通常用于将业务逻辑和UI分离。例如,在MVP(Model-View-Presenter)模式中,Presenter通常充当桥接的角色,将View和Model分离开来。Presenter通过接口(抽象类)与View进行交互,并通过Model来获取数据。
下面是一个简单的MVP示例:
public interface LoginView {void showProgress();void hideProgress();void setUsernameError();void setPasswordError();void navigateToHome();
}public interface LoginPresenter {void validateCredentials(String username, String password);
}public class LoginPresenterImpl implements LoginPresenter {private LoginView loginView;private LoginModel loginModel;public LoginPresenterImpl(LoginView loginView) {this.loginView = loginView;loginModel = new LoginModelImpl();}@Overridepublic void validateCredentials(String username, String password) {if (TextUtils.isEmpty(username)) {loginView.setUsernameError();return;}if (TextUtils.isEmpty(password)) {loginView.setPasswordError();return;}loginView.showProgress();loginModel.login(username, password, new LoginModel.OnLoginFinishedListener() {@Overridepublic void onUsernameError() {loginView.hideProgress();loginView.setUsernameError();}@Overridepublic void onPasswordError() {loginView.hideProgress();loginView.setPasswordError();}@Overridepublic void onSuccess() {loginView.hideProgress();loginView.navigateToHome();}});}
}public interface LoginModel {interface OnLoginFinishedListener {void onUsernameError();void onPasswordError();void onSuccess();}void login(String username, String password, OnLoginFinishedListener listener);
}public class LoginModelImpl implements LoginModel {@Overridepublic void login(final String username, final String password, final OnLoginFinishedListener listener) {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {if (username.equals("user") && password.equals("password")) {listener.onSuccess();} else if (!TextUtils.isEmpty(username)) {listener.onPasswordError();} else {listener.onUsernameError();}}}, 2000);}
}
在上面的代码中,我们定义了一个LoginView接口,其中包含了一些用于显示UI的方法。然后,我们定义了一个LoginPresenter接口,它与LoginView接口相连,并通过LoginModel来获取数据。最后,我们实现了具体的LoginPresenterImpl和LoginModelImpl类。
通过这种方式,我们将UI和业务逻辑分开,从而使代码结构更清晰,易于维护。
源码解析
在Android源码中,桥接模式也有广泛的应用。例如,在View系统中,View和ViewGroup之间就采用了桥接模式来实现解耦。
在View系统中,View是Android系统中的基本UI组件,而ViewGroup则是一种容器组件,用于将多个View组合在一起。在这两个组件中,都有一个名为LayoutParams的内部类,用于描述组件的布局参数。
在早期的Android版本中,View和ViewGroup之间是通过继承来实现布局参数的传递的。但是这样会导致代码结构复杂且难以维护,因此在Android 2.2版本中,Google采用了桥接模式来重构View系统,从而使其更加灵活和易于维护。
下面是一个简单的代码示例,展示了View和ViewGroup之间是如何通过桥接模式来传递布局参数的:
public class View {private LayoutParams mLayoutParams;public void setLayoutParams(LayoutParams params) {mLayoutParams = params;}public LayoutParams getLayoutParams() {return mLayoutParams;}public static class LayoutParams {// 布局参数的属性}
}public class ViewGroup extends View {private ArrayList<View> mChildList = new ArrayList<>();public void addView(View child) {mChildList.add(child);child.setParent(this);}public void removeView(View child) {mChildList.remove(child);child.setParent(null);}public void removeAllViews() {for (View child : mChildList) {child.setParent(null);}mChildList.clear();}public static class LayoutParams extends View.LayoutParams {// 布局参数的属性}
}
在上面的代码中,我们首先定义了一个View类,并在其中包含了一个LayoutParams内部类。然后,我们定义了一个ViewGroup类,它继承自View,并增加了一个mChildList成员变量和相关的方法,用于管理子View。
最后,我们在ViewGroup中定义了一个LayoutParams内部类,并继承自View.LayoutParams。通过这种方式,我们将布局参数从View中分离出来,使得View和ViewGroup之间的关系更加清晰。
总之,桥接模式是一种常用的设计模式,它可以帮助我们将抽象和实现分离开来,从而实现解耦。
相关文章:
23种设计模式-桥接模式(安卓应用场景介绍)
概念 桥接模式是一种结构型设计模式,它通过将抽象与其实现分离来解耦。它使用接口(抽象类)作为桥梁,将一个抽象类与其实现类的代码分别独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”…...
2021牛客OI赛前集训营-提高组(第四场) T3快速访问
2021牛客OI赛前集训营-提高组(第四场) 题目大意 有一棵n1n1n1个节点的树,根节点为0。给你一个kkk,定义集合Si{j∈Z∣max(1,i−k)≤j<i}∪{0}S_i\{j\in Z|\max(1,i-k)\leq j<i\}\cup\{0\}Si{j∈Z∣max(1,i−k)≤j<i…...
【大数据是什么】
大数据是什么大数据是做什么的?大数据主要有哪些职位 ?大数据运维工程师数据仓库开发工程师ETL工程师大数据开发工程师BI工程师算法工程师大数据平台开发工程师大数据架构师讲述一下自己的大数据学习之路大数据是做什么的? 2014年,…...
大数据 | centos7图形界面无法执行yum命令
大家好,今天是三八女神节了! 你知道吗?世界上第一位电脑程序设计师是名女性,Ada Lovelace (1815-1852)。 她是一位英国数学家兼作家,第一位主张计算机不只可以用来算数的人,也发表了第一段分析机用的演算…...
三维人脸实践:基于Face3D的渲染、生成与重构 <一>
face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 该方法广泛用于基于三维人脸关键点的人脸生成、属性检测(如位姿、深度、PNCC等),能够快速实现人脸建模与渲染。推荐…...
Javascript 设计模式
设计模式的五大设计原则(SOLID)单一职责:一个程序只需要做好一件事。如果功能过于复杂就拆分开,保证每个部分的独立开放封闭原则:对扩展开放,对修改封闭。增加需求时,扩展新代码,而不是修改源代码。这是软件设计的终极…...
JAVA-文档工具screw-gui
前言 为什么萌生了写文档工具得想法,因为在项目开发得过程中,经常需要补充一些文档,比如数据库文档、详细设计文档等等,文档与项目相绑定,在项目需求新增或变更时,文档也需要反反复复得修改。 1. 数据库…...
开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)
开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一) 前言——系列介绍 本系列文章主要是记录笔者在鸿蒙南向的学习与工作中的知识点笔记记录,其中不止会针对鸿蒙中的学习问题进行思考与记录,也会对涉及到的一些嵌入式等其他领域知识&…...
Spring - Spring框架概述面试题总结
文章目录01. 什么是Spring?02. Spring框架的设计目标,设计理念,和核心是什么?03. Spring的优点是什么?04. Spring框架中都用到了哪些设计模式?05. Spring有哪些应用场景?06. Spring由哪些模块组成…...
学习python好就业么
Python的普及与数据挖掘、人工智能和数值计算等领域的蓬勃发展相关,但同时也与普遍编程需求的增加有关。 Python作为人工智能的头号语言,一方面会吸引大量计划从事人工智能的人来学习,另一方面自然也带动了网络上对这门“新语言”的关注和讨…...
瑞幸咖啡的最终目标并不是做国内市场大哥
出品 | 何玺 排版 | 叶媛 日前,瑞幸咖啡发布2022年第四季度及全年财报。数据显示,在刚刚过去的2022年,瑞幸咖啡首次实现了营收超百亿,门店规模也超越老对手星巴克,成为了国内第一连锁咖啡品牌。 那么,瑞幸…...
GPT 模型介绍 | GPT3 / GPT3.5 + Flask | Github源码链接
1. 模型介绍 Chatgpt 使用与 InstructGPT相同的方法,使用来自人类反馈的强化学习 (RLHF) 来训练该模型,但数据收集设置略有不同。我们使用监督微调训练了一个初始模型:人类 AI 训练员提供对话,他们在对话中扮演双方——用户和 AI…...
蓝桥杯入门即劝退(二十六)组合问题(回溯算法)
-----持续更新Spring入门系列文章----- 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章对你有所帮助-------- 专栏:蓝桥杯系列 一、题目描述 给定两个整数 n …...
现代卷积神经网络(ResNet)
专栏:神经网络复现目录 本章介绍的是现代神经网络的结构和复现,包括深度卷积神经网络(AlexNet),VGG,NiN,GoogleNet,残差网络(ResNet),稠密连接网络…...
PTA:L1-019 谁先倒、L1-020 帅到没朋友、L1-021 重要的话说三遍(C++)
目录 L1-019 谁先倒 问题描述: L1-020 帅到没朋友 问题描述: 实现代码(只过了部分): L1-021 重要的话说三遍 问题描述: 实现代码: 无解析 L1-019 谁先倒 问题描述: 划拳是…...
STL常见容器之set/multiset、map/multimap
set/multiset—集合容器 特点 所有元素都会在插入时自动被排序 本质 set/multiset属于关联式容器,底层结构是二叉树实现 set和multiset区别 set不可以插入重复数据,而multiset可以set插入数据的同时会返回插入结果,表示插入是否成功multiset…...
ThreadLocal 实现原理
每个 Thread 中都存储着一个成员变量:ThreadLocalMap /** InheritableThreadLocal values pertaining to this thread. This map is* maintained by the InheritableThreadLocal class.*/ThreadLocal.ThreadLocalMap inheritableThreadLocals null; ThreadLocal 本…...
BUUCTF [羊城杯 2020]easyre 题解
一.查壳 64位无壳 二.主函数逻辑 可以得知flag长度为38,然后进行三次加密 第一次加密是base64加密,得到code1 第二次加密是将code1拆成四段赋给code2 第三次加密是将code2内的数字和字母移3位,其他字符不变 str2保存的是最终的加密字符 三.encode_one_base64 看到主函数…...
网络协议(十二):HTTPS(SSL/TLS、TLS1.2的连接)
网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 网络协议(二):MAC地址、IP地址、子网掩码、子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络分类、ISP、上网方式、公网私网、NAT 网络…...
九九乘法表--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例9:九九乘法表 乘法口诀是中国古代筹算中进行乘法、除法、开方等运算的基本计算规则,沿用至今已有两千多年。古代的乘法口诀与现在使用的乘法口诀顺序相反,自上而下从“九九八十一”开始到“一一如一”为止,因此,古…...
在超算上安装文件树命令tree
超算平台使用的centos系统没有内置tree命令,需要通过源码安装。记录安装流程如下。 1. 下载源码包 下载链接如下: http://mama.indstate.edu/users/ice/tree/ 选择“Download the latest version” 如本文下载了源码包“tree-2.1.0.tgz”. 2. 源码包…...
论文投稿指南——中文核心期刊推荐(经济管理)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
在vue中如果computed属性是一个异步操作怎么办?
在计算属性中使用异步方法时,可以使用async/await来处理异步操作。由于计算属性是基于它们的依赖缓存的,所以我们需要使用一个返回Promise的异步方法来确保计算属性能够正常运行。 下面是一个简单的示例,演示如何在计算属性中使用异步方法&am…...
SRP合批问题
1)SRP合批问题 2)多个Base相机渲染到同一个渲染目标,移动平台花屏的问题 3)粒子系统对GPU Instancing的支持 4)如何修改URP下场景和UI分辨率分离(不需要改颜色空间) 这是第327篇UWA技术知识分…...
蓝牙5.1低功耗SOC 私有协议2.4GHz芯片HS6621
HS6621CxC是一个优化功耗真正芯片系统(SOC)解决方案,适用于蓝牙低功耗和私有的2.4GHz应用场景。它集成了一个高性能、小功率的射频收发器,具有蓝牙基带和丰富的外围IO扩展。还集成了电源管理,以提供高效的电源管理。 …...
数据库连接池
数据库连接---执行完毕---释放 连接--释放 十分浪费系统资源 池化技术:准备一些预先的资源,过来就连接预先准备好的 最小连接数: 10 最大连接数:15 业务最高承载上限 排队等待, 等待超时:100…...
Arrays-sort-的用法
1.集合交换元素 Collections.swap(List<?> list, int i, int j); 源码: /*** Swaps the elements at the specified positions in the specified list.* (If the specified positions are equal, invoking this method …...
华为OD机试真题Java实现【寻找相同子串】真题+解题思路+代码(20222023)
寻找相同子串 题目 给你两个字符串 t 和 p ,要求从 t 中找到一个和 p 相同的连续子串,并输出该字串第一个字符的下标。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Java)真题目录汇总 输入描述: 输入文件包括两行,分别表示字符串 t 和 p ,保证 t 的长度…...
性能指标 确定性能目标 性能场景设计
性能测试指标 性能测试指标分为业务技术指标和系统资源指标,在服务端性能业务技术指标中分为三个指标,系统吞吐量,响应时间和并发用户数。响应时间分为前端展现时间和系统响应时间两部分,系统吞吐量体现软件系统负载承受能力的指…...
ENVI_Classic:快速入门_菜单栏常见功能的基本介绍
说明:由于实验要求,所以并没有对各个功能进行详尽的解释,大多点到为止,少部分实验内容是实验要求所以步骤详尽。当然由于经验不足,有一些可能存在错误恳请指正.1. 实验目的通过ENVI Classic对自行下载的遥感图像进行一…...
wordpress简化/应用关键词优化
C语言的变量存储类别1、按照变量生存周期划分:2、按照存储类别分类:自动变量静态变量寄存器变量外部变量1、按照变量生存周期划分: 静态存储方式 程序运行期间分配固定的存储空间的方式。 静态存储区中存放了整个程序执行过程中都存在的变量&…...
牙科医院网站源码/数据查询网站
核心提示:河南禹州一农民为了逃避过路费,多挣钱,拿着两套假军车牌照营运,8个月里免费通行高速2361次,偷逃过路费368万余元。拉沙挣了20多万元。事发后法院以诈骗罪判处其无期徒刑。据律师称可能成为全国首例案件。来源…...
福田祥菱箱货/如何优化关键词提升相关度
拒绝服务***(DoS)与分布式拒绝服务***(DDoS)是破坏网络服务的***方式,它们共同的特点就是其根本目的是使受害主机或网络无法及时接收并处理外界请求,或无法及时回应外界请求。最新推荐 DDOS***!如何有效屏蔽?企业对付DDoS*** 资深…...
有什么网站可以免费/google play应用商店
当发生此错误常规的解决办法如下: mybatis的映射文件 *Mapper.xml文件头错误,我是直接从sql-map-config.xml文件中复制过来的,如下: <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configurati…...
两学一做专题网站/湖南网络推广服务
要想在浏览器启动APP的方法例如以下: 在须要跳转的ACTIVITY中加入intent-filter的相关信息: <intent-filter> <data android:scheme"com.example.scheme" /> </intent-filter> 实比例如以下:<activity an…...
萍乡做网站/长沙关键词优化首选
# 可以用80端口进行试验,只要打开浏览器浏览网页即可捕获数据包import os########################################################## 定义结构体数组,保存源IP、目的IP、协议类型################################################class inf:def __in…...