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

Android设计模式--适配器模式

至诚之道,可以前知

一,定义

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

适配器模式在我们的开发中使用率极高,ListView,GridView,RecyclerView等都使用了适配器模式,它其实就是将两个不兼容 的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得他们能够协作起来。

二,使用场景

1,系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容

2,想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

3,需要一个统一的输出接口,而输入端的类型不可预知

三,角色介绍

1,Target: 目标角色,也就是所期待得到的接口。注意:在类适配器模式中,目标不可以是类

2,Adaptee:现在需要适配的接口

3,Adapter:适配器角色,也是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类

四,类适配器模式的使用

玩过和平精英吃鸡手游的玩家都知道,大家都是在手机或者平板电脑上面用手搓者玩的,这更适合那些没玩过射击游戏的新手玩家,但是对于大多数端游老玩家来说,手搓很不习惯,于是王座就诞生了,它可以让玩家通过键鼠模拟手搓在手机或者平板上操作游戏,这里我们就可以把王座看作是适配器角色,目标角色就是键鼠操作游戏,Adaptee角色就是手搓操作游戏。

创建一个目标角色接口使用键鼠玩游戏:

public interface KeyMouse {void playGameByKM();
}

创建一个适配器角色,王座,可以通过王座玩游戏:

public class Adapter extends Hand implements KeyMouse{@Overridepublic void playGameByKM() {System.out.println("使用键鼠输入操作信号");System.out.println("使用王座将键鼠操作信号转换成模拟手指操作信号");playGameByHand();}
}

创建一个被适配的角色,手搓玩游戏:

public class Hand {public void playGameByHand(){System.out.println("通过手搓玩游戏");}
}

使用:

Adapter adapter =new Adapter();
adapter.playGameByKM();

输出:

这样就可以通过王座玩吃鸡了。

五,对象适配器模式的使用

与类适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adapter类,而是使用代理关系连接到Adapter类。

还是上面那个吃鸡的例子。

首先还是创建我们的目标接口来使用键鼠玩游戏:

public interface KeyMouse {void playGameByKM();
}

然后创建一个被适配的角色,手搓玩游戏:

public class Hand {public void playGameByHand(){System.out.println("通过手搓玩游戏");}
}

最后创建我们的适配器adapter,王座:

public class KingAdapter implements KeyMouse{private Hand hand;public KingAdapter(Hand hand) {this.hand = hand;}@Overridepublic void playGameByKM() {System.out.println("使用键鼠输入操作信号");System.out.println("使用王座将键鼠操作信号转换成模拟手指操作信号");hand.playGameByHand();}
}

最后在使用时:

KingAdapter adapter =new KingAdapter(new Hand());
adapter.playGameByKM();

输出:

该方式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果,比类适配器更为灵活,它的另一个好处是被适配对象中的方法不会暴露出来,而类适配器由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有,这使得Adapter类出现一些奇怪的接口,用户使用成本较高,因此,对象适配器模式更加灵活实用。

六,总结

在实际开发中,特别是在自定义view等情况下,适配器模式的应用非常广泛且具有重大意义。

优点:

1,更好的复用性:系统需要使用现有的类,而次类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用。

2,更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然的扩展系统的功能。

缺点:过多的使用适配器,会让系统非常凌乱,不易整体把握。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不适用适配器,而是直接对系统进行重构。

相关文章:

Android设计模式--适配器模式

至诚之道,可以前知 一,定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式在我们的开发中使用率极高,ListView,GridView&am…...

jQuery_06 基本过滤器的使用

什么是过滤器? 过滤器就是用来筛选dom对象的,过滤器是和选择器一起使用的。在选择了dom对象后在进行过滤筛选。 jQuery对象中存储的dom对象顺序与页面标签声明有关系。 声明顺序就是dom中存放的顺序 1.基本过滤器 使用dom对象在数组中的位置来作为过滤条…...

Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...

AI绘画“湿地公园的美女”

1、AI绘画:湿地公园的美女 通过输入描述:你需要什么场景的什么创作内容,AI根据内容创造出适合的主题 如图所示:请帮我创作一个湿地公园的像高圆圆的美女图片。 输出的结果如下:总体来说感觉还是非常快,基…...

延时任务定时发布,基于 Redis 与 DB 实现

目录 1、什么是延时任务,分别可以使用哪些技术实现? 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、取消任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据,同步到 Redis 中 1、什么是延时任务&#xff…...

Nacos安装使用

Nacos安装使用 官方下载地址: https://github.com/alibaba/nacos/releases 官方文档地址: https://nacos.io/zh-cn/docs/quick-start.html Nacos介绍 Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心&a…...

了解抽象思维的应用与实践

目录 一、快速了解抽象思维 (一)抽象思维的本质理解 (二)系统架构中的重要性 (三)软件开发中抽象的基本过程思考 意识和手段 抽象的方式 抽象层次的权衡 二、业务中的应用实践 (一&…...

【阿里云】图像识别 智能分类识别 增加垃圾桶开关盖功能点和OLED显示功能点(二)

一、增加垃圾桶开关盖功能 环境准备 二、PWM 频率的公式 三、pthread_detach分离线程,使其在退出时能够自动释放资源 四、具体代码实现 图像识别数据及调试信息wget-log打印日志文件 五、增加OLED显示功能 六、功能点实现语音交互视频 一、增加垃圾桶开关盖功能…...

linux centos上安装python3.11.x详细完整教程

一. 安装步骤 注意: 1、安装python3.11的其他版本替换下面的版本信息即可。(如想安装3.11.5将案例中的3.11.0替换成3.11.5即可) #下载最新的软件安装包 wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#解压缩安装包 tar -xzf Python-3.11.0.tg…...

itext - PDF模板套打

目录 环境配置 快速使用 代码实现 添加图片 封装 项目需求:获取列表数据之后直接将数据生成一个pdf。因此需要使用到 itext 对pdf进行直接操作。 环境配置 需要为pdf添加文字域,因此需要安装Adobe Acrobat 准备一个空的PDF文件,如果有现…...

指针的使用和传址调用

1.引入 学习指针的⽬的是使⽤指针解决问题&#xff0c;那什么问题&#xff0c;⾮指针不可呢&#xff1f; 例如&#xff1a;写⼀个函数&#xff0c;交换两个整型变量的值。 ⼀番思考后&#xff0c;我们可能写出这样的代码&#xff1a; #include <stdio.h> void Swap1(int…...

【Leetcode】【实现循环队列】【数据结构】

代码实现&#xff1a; typedef struct {int front;int back;int k;int* a;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->frontobj->back; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back1)%(obj->…...

电力感知边缘计算网关产品设计方案-软件架构(业务流程)

软件架构(业务流程) 基于前端系统提供的硬件通信平台,后端系统以控制执行单元为核心,协同控制通信管理、驱动适配、存储单元等职能单元完成与前端系统的通信数据交互业务,在经历以下业务流程后,完成设备自适应通信业务功能。 1.外部设备通信前端系统 前端系统连接新的…...

【labelimg打不开】

labelimg打不开 一、 报错1.1 排除错误 **解决方法&#xff1a;** 一、 报错 当运行labelimg程序报错此条时 AssertionError: Missing string id : useDefaultLabel 1.1 排除错误 第一&#xff0c;进入创建的虚拟环境&#xff0c;输入pip list 查看是否安装了labelimg 第二&…...

JAVA之异常详解

1. 异常的概念与体系结构 1.1 异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常 1. 算术异常 public class Test {public static void main(String[] args) {System.out.println(10/0);} } 因为 0 不能当被除数&#xff0c;所以报出了异常&#…...

模型优化【2】-剪枝[局部剪枝]

模型剪枝是一种常见的模型压缩技术&#xff0c;它可以通过去除模型中不必要的参数和结构来减小模型的大小和计算量&#xff0c;从而提高模型的效率和速度。在 PyTorch 中&#xff0c;我们可以使用一些库和工具来实现模型剪枝。 pytorch实现剪枝的思路是生成一个掩码&#xff0…...

VMware 系列:ESXI6.7升级7.0

ESXI6.7升级7.0 一、下载补丁二、上传文件三 启用Shell四、登录Shell后台五、删除不兼容驱动六、正常升级最近,将一台使用ESXI6.7的虚拟机升级到了7.0版本,下面记录一下自己的升级过程。 升级条件 首先确保硬件是否能升级到7.0版本,物理网卡驱动为e1000e不能升级,如果是ig…...

4-20mA高精度采集方案

下载链接&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247557466&idx1&snb5a323285c2629a41d2a896764db27eb&chksmfcfaf28dcb8d7b9bb6211030d9bda53db63ab51f765b4165d9fa630e54301f0406efdabff0fb&token976581939&langzh_CN#rd …...

案例022:基于微信小程序的行政复议在线预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

Go 工具链详解(七):模块缓存清理工具

go mod 缓存 在 Golang 中&#xff0c;模块是对一组版本化的包的集合的描述。Go 1.11 版本引入了模块支持&#xff0c;通过 go mod 命令提供了对模块的管理。Go 模块的一个重要特性是依赖管理&#xff0c;可以清晰地定义项目所依赖的模块及对应的版本&#xff0c;并确保代码使…...

Qwen3-14B赋能内容创作团队:私有部署后批量生成营销文案实战案例

Qwen3-14B赋能内容创作团队&#xff1a;私有部署后批量生成营销文案实战案例 1. 营销文案创作的痛点与解决方案 在当今快节奏的数字营销环境中&#xff0c;内容创作团队面临着巨大压力。每天需要产出大量高质量的营销文案&#xff0c;包括产品描述、社交媒体帖子、广告文案等…...

Cold Diffusion:超越高斯噪声的通用图像生成框架解析

1. Cold Diffusion的核心思想&#xff1a;从噪声依赖到通用框架 第一次看到Cold Diffusion论文时&#xff0c;我正被传统扩散模型对高斯噪声的强依赖性困扰着。当时在做一个艺术风格转换项目&#xff0c;发现用标准DDPM处理非自然图像时效果总是不稳定。Cold Diffusion的出现就…...

rtrvr.ai AI 子程序:零 token 成本自动化脚本,解决网络智能体认证难题!

rtrvr.ai 产品介绍rtrvr.ai 提供多种产品服务&#xff0c;包括博客、预约演示、定价、API 文档、扩展程序、云端服务等。AI 子程序功能特点只需录制一次浏览器任务&#xff0c;就能将其作为可调用工具进行回放&#xff0c;零 token 成本&#xff0c;100% 确定性&#xff0c;认证…...

APK-Installer:Windows平台最专业的Android应用安装终极解决方案

APK-Installer&#xff1a;Windows平台最专业的Android应用安装终极解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾因Windows和Android系统间的壁垒而…...

告别npm付费!用Verdaccio在Mac/Win上10分钟搞定私有仓库(保姆级配置+权限管理)

告别npm付费&#xff01;用Verdaccio在Mac/Win上10分钟搞定私有仓库&#xff08;保姆级配置权限管理&#xff09; 在当今快节奏的前端开发中&#xff0c;私有npm仓库已成为团队协作的刚需。想象一下&#xff1a;当你的团队正在开发多个内部组件库&#xff0c;却不得不反复通过…...

拆解一个经典数电密码锁:从555脉冲到74LS190计数,再到7485比较的完整信号流分析

经典数字密码锁系统全链路信号解析&#xff1a;从时钟生成到密码比对的工程思维训练 在电子技术快速迭代的今天&#xff0c;传统数字电路设计依然是理解计算机底层逻辑的必修课。这个由555定时器、74LS190计数器和7485比较器构建的密码锁系统&#xff0c;堪称数字电路教学的&q…...

Pixel Couplet Gen 惊艳作品集:算法驱动下的传统年俗像素艺术

Pixel Couplet Gen 惊艳作品集&#xff1a;算法驱动下的传统年俗像素艺术 1. 当传统年俗遇上像素艺术 春节贴春联是中国人延续千年的文化传统&#xff0c;而如今&#xff0c;这项传统正在与数字艺术碰撞出新的火花。Pixel Couplet Gen模型通过算法创新&#xff0c;将传统春联…...

Agent Skill开发:Qwen3-ForcedAligner-0.6B语音助手集成

Agent Skill开发&#xff1a;Qwen3-ForcedAligner-0.6B语音助手集成 1. 引言 你有没有遇到过这种情况&#xff1a;对着智能音箱说了半天&#xff0c;它却总是理解错你的意思&#xff1f;或者看视频时想要精确找到某个台词出现的时间点&#xff0c;却要反复拖动进度条&#xf…...

Spring AI集成State Graph实战指南

Spring AI集成State Graph实战指南 前言 Spring AI 作为 Spring 生态的重要一员&#xff0c;极大地提升了智能应用的开发效率。State Graph 作为 AI 流程编排与状态管理的利器&#xff0c;能帮助开发者高效管理业务流程。在本篇实战指南中&#xff0c;将通过详实案例&#xff0…...

快速上手:使用ComfyUI可视化工作流调用BERT文本分割模型

快速上手&#xff1a;使用ComfyUI可视化工作流调用BERT文本分割模型 你是不是对文本处理模型感兴趣&#xff0c;但又觉得写代码太麻烦&#xff1f;或者你想快速实验一下BERT模型&#xff0c;看看它能把一段文字切成什么样&#xff1f;今天&#xff0c;我们就来聊聊一个特别适合…...