Android设计模式详解之适配器模式

news2024/12/25 14:52:29

前言

适配器模式在Android开发中使用率很高,如ListViewRecyclerView

定义:适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作;

使用场景:

  • 系统需要使用现成的类,而此类的接口不符合系统的需要,即接口不兼容;
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
  • 需要一个统一的输出接口,而输入端的类型不可预知;

适配器模式分为两种:类适配器模式对象适配器模式

类适配器模式

类适配器模式UML类图:
类适配器UML
Target:目标角色,也就是所期待得到的接口;
Adaptee:需要适配的接口;
Adapter:适配器角色,适配器把源接口转换为目标接口;

示例代码

这里以生活中的电源适配器举例,我们知道生活中的电压是220V,而手机充电电压则为5V,其实手机充电器就充当适配器的角色

  • 定义电压适配接口,相当于target角色,IVolt
/**
 * 电压适配接口,相当于target角色
 */
interface IVolt {
    //适配结果为5V
    fun getVolt5(): Int
}
  • 定义220V电压类,相当于adaptee角色,Volt220
/**
 * 220V电压,相当于adaptee角色
 */
open class Volt220 {
   protected fun getVolt220(): Int {
        return 220
    }
}
  • 定义电压适配器,将220V适配成5V电压,VoltAdapter
/**
 * 电压适配器,将220V适配成5V电压
 */
class VoltAdapter : Volt220(), IVolt {

    override fun getVolt5(): Int {
        return getVolt220() - 215 //模拟变压操作
    }
}
  • 编写测试类进行验证
object Test {
    @JvmStatic
    fun main(args: Array<String>) {
        val adapter = VoltAdapter()
        println("经过适配器适配后的电压:${adapter.getVolt5()}")
    }
}

结果输出:

经过适配器适配后的电压:5

缺点:由于是继承关系,被适配器类的函数在adapter中也可以调用;

对象适配器模式

对象适配器模式UML类图:
对象适配器模式UML
可以看出与类适配器模式的区别主要在于适配器是持有需要适配的对象,通过这种形式来实现接口的适配;

这里我们同样以电压适配为例;

  • 定义电压适配接口,相当于target角色,IVolt
/**
 * 电压适配接口,相当于target角色
 */
interface IVolt {
    //适配结果为5V
    fun getVolt5(): Int
}
  • 定义220V电压类,相当于adaptee角色,Volt220
/**
 * 220V电压,相当于adaptee角色
 */
open class Volt220 {
    fun getVolt220(): Int {
        return 220
    }
}
  • 定义适配器类,VoltAdapter
/**
 * 电压适配器,将220V适配成5V电压
 */
class VoltAdapter(private val volt220: Volt220) : IVolt {

    override fun getVolt5(): Int {
        return volt220.getVolt220() - 215 //模拟变压操作
    }
}
  • 编写测试类验证
object Test {
    @JvmStatic
    fun main(args: Array<String>) {
        val adapter = VoltAdapter(Volt220())
        println("经过适配器适配后的电压:${adapter.getVolt5()}")
    }
}

结果输出:

经过适配器适配后的电压:5

Android源码中的适配器模式

  • ListView、RecyclerView的adapter,这里不再过多赘述;
  • Retrofit中将okhttp3.Call转变成为 retroift中的Call,感兴趣的小伙伴可以移步:Retrofit原理解析(二)

总结

优点:

  • 更好的复用性,系统需要使用现有的类,而此类的接口不符合系统的需要时,通过适配器模式就可以让功能得到复用;
  • 更好的扩展性,实现适配器功能时,可以调用自己开发的功能,从而自然地扩展系统的功能;

缺点:

  • 过多的使用适配器,会让系统非常乱,明明看到调用的是A接口,其实内部被适配成了B接口的实现,如果不是很有必要,建议直接对系统进行重构;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

相关文章

2023年加密行业会更难吗?欧科云链研究院“七大趋势预测”

回望2022&#xff0c;加密行业遭遇了种种不可控因素而导致的艰难险阻&#xff0c;也在变革与发展中孕育着生机与活力。 这一年&#xff0c;我们亲眼目睹了Luna暴雷&#xff0c;三箭资本、FTX这些曾经被认为“大而不倒”的机构接连倒下&#xff0c;市场信心严重受挫&#xff1b;…

登陆港股市场,阳光保险的 “价值锚点”

不确定性环境里&#xff0c;信心比黄金还重要。 最近&#xff0c;利好信号频频出现在保险行业&#xff0c;资本信心不断加固。上个月月底&#xff0c;个人养老金制度启动实施&#xff0c;市场迅速传来喝彩声。这不仅将加快推动养老保险作为第三支柱的壮大&#xff0c;而且还为…

ARM体系架构中的存储系统

在计算机系统当中&#xff0c;数据的存储是以字节为单位的&#xff0c;每个地址单元当中都可以存放一个字节的数据&#xff0c;每个字节为8bit。在C语言中编译器为char型的数据分配了一个字节的存储空间&#xff0c;为long型的数据分配了4个字节的存储空间&#xff0c;为int型的…

【NI Multisim 14.0编辑环境——工具栏】

目录 序言 一、工具栏 &#x1f34a;1.“标准”工具栏 &#x1f34a; 2.视图工具栏 &#x1f34a;3.“主”工具栏 &#x1f34a;4.“元器件”工具栏 &#x1f34a;5.“Simulation”&#xff08;仿真&#xff09;工具栏 &#x1f34a;6.“Place probe”&#xff08;放置探针…

ARM64内存虚拟化分析(2)常用结构体

内存虚拟化相关的几个重要结构体如下图所示&#xff1a; 这里介绍几个结构体以及相互之间有关系。 &#xff08;1&#xff09;AddressSpace结构体 它用于表示一个虚拟机或虚拟CPU能够访问的所有物理地址。其中&#xff1a; root&#xff1a;指向根MR Current_map&#xff1…

营销在中国

&#xff08;1&#xff09;4P、4C、4R、4I作为一个企业&#xff0c;不外乎就是两个是&#xff1a;产-销。你生产-客户购买&#xff0c;这个交易能做成&#xff0c;不外乎在于交换的价值&#xff0c;以及交易的价格-成本。一、4P4P&#xff0c;是美国密歇根大学教授杰罗姆麦卡锡…

向量的点乘与X乘以及意义

一、向量的点乘 向量的点乘&#xff08;dot&#xff09;是一个标量积&#xff0c;也叫向量的内积、数量积。 点乘公式&#xff1a; 有向量a b a(a1,a2,a3,...,an) b(b1,b2,b3,...,bn); 那么向量a(dot)ba1b1a2b2a3b3....anbn 从上面我们能可以看出&#xff0c;点乘得到的结…

2022年个人融资方法和工具研究报告

第一章 理论和概况 1.1 融资概念 融资&#xff0c;英文为Financing&#xff0c;指为支付超过现金或转账的购货款而采取的货币交易手段&#xff0c;或者为取得特定资产而筹集资金所采取的货币手段。融资通常指货币资金的持有者和需求者之间&#xff0c;直接或间接地进行资金融…

Appium基础 — 模拟手势点击坐标

1、模拟手势点击坐标 在定位元素的时候&#xff0c;你使出了十八班武艺还是定位不到&#xff0c;怎么办呢&#xff1f;&#xff08;面试经常会问&#xff09; 那就拿出绝招&#xff1a;点击元素所在位置的坐标。&#xff08;坐标定位&#xff09; 详细说明&#xff1a; 如下…

OpenWrt无法打开国内网站的解决方法

最近小半个月以来根据lean和lieno源码编译的OpenWrt固件在使用了smartdns之后会出现无法打开国内网页的情况。 诡异的是&#xff0c; 重启防火墙之后&#xff0c; 能正常访问百度等国内网站&#xff0c; 但是&#xff0c; 过上一段时间&#xff0c; 就又不行了。 在经过近一个…

示波器应用(三)

示波器可做什么&#xff1f; 基础材质检查环境搭建校验 相似材质之间的细微差异分析 场景调光依据/竞品分析 定位曝光、色相问题 风格化调色监视 LUTs检查 材质检查 单看上图的分量示波器&#xff0c;仔细想一想这张图是什么色相&#xff1f; 公布答案 分量示波器rgb模…

电子采购方案:构建高效智能数字化采购

过去几十年&#xff0c;公用事业行业发生了重大变化。能源需求的转变导致企业利润率的波动&#xff0c;但不是运营成本的波动。 许多公用事业公司通过后勤部门流程自动化来削减成本&#xff0c;比如招采流程自动化。 在招采活动中&#xff0c;人工招采会产生盲点。由于公共事业…

Vue(一)

1.Vue简介 将html/css/js封装到vue里&#xff0c;形成一个组件&#xff0c;改动某个组件里内容不会影响另一个 要实现将左边数据变成li的形式放进容器里面&#xff0c;传统实现方式&#xff1a; vue形式编码简易实现:指令实现 Diff会跟原来的比较&#xff0c;跟原来一样的会直接…

设备管理器,其他设备,PCI数据捕获和信号处理控制器出现感很多未知设备感叹号,通用解决方法,以华为matebook为例

问题的关键是找到对应的驱动。 通用解决方法&#xff1a; 打开设备管理器&#xff0c;找到未知设备&#xff0c;右键属性——详细信息——下拉列表找到硬件标识符Hardware Ids——复制第一行的ID——打开浏览器搜索相关内容&#xff0c;确定该设备对应的驱动名称——从可靠渠…

在人生最好的状态读研,社科院与杜兰大学金融管理硕士项目与你共同努力奔赴未来

人生中最好的状态是什么阶段呢&#xff1f;说起中年&#xff0c;人们往往会联想到“危机”、“油腻”等词语&#xff0c;确实&#xff0c;中年人面临着事业、家庭、健康等的各种关卡&#xff0c;让人觉得危机四伏。其实中年也是人一生中最为丰美的岁月&#xff0c;面对生活中的…

F280049C Programmable Gain Amplifier PGA

文章目录PGA14.1 Introduction简介14.1.1 Features特性14.1.2 Block Diagram结构框图14.2 Linear Output Range线性输出范围14.3 Gain Mode放大模式14.4 External Filtering外部滤波14.7 Enabling and Disabling the PGA Clock时钟使能禁止14.10 Analog Front End Integration模…

Github Package npm 应用发布实践

Github Package npm 应用发布实践 文章目录Github Package npm 应用发布实践1. 简介2. 创建新库3. 编写 index.js4. npm init 初始化5. npm install6. 创建 release-package.yml7. 发布8. 查看已发布的包9. 管理 npm 包1. 简介 GitHub Packages 是一个用于托管和管理包的平台&…

高压功率放大器在磁巴克豪森噪声表征方法研究中的应用

实验名称&#xff1a;基于数据驱动的结构钢表面应力磁巴克豪森噪声表征方法研究 研究方向&#xff1a;材料测试 实验目的&#xff1a; 磁巴克豪森噪声&#xff08;Magnetic Barkhausen Noise,MBN&#xff09;技术可用于定量评估铁磁材料的表面应力。当前MBN法应力评估技术存在特…

【ESP32-Matter】基于 Matter 协议的 esp32-c3 开发板通讯测试过程

实验结果&#xff1a; 关于实验环境的搭建&#xff0c;请参考博客&#xff1a; 【ESP-Matter】基于matter协议 chip-tool 控制 esp32-c3 开发板点灯 写在前边的话&#xff1a; matter 能带来什么&#xff1f; 让多种支持 IP 网络的设备协同工作&#xff0c;如 Wi-Fi 和 Th…

商汤科技感知算法一面复盘

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 自我介绍 介绍自己的项目 Inception网络的核心模块是什么&#xff0c;有什么用 Inception模块的核心思想就是将不同的尺度的信息特征以并行分支的方式结合在一起&#xff0c;经过不同卷积层处理的结果矩阵在…