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接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不适用适配器,而是直接对系统进行重构。

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

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

相关文章

面试cast:reinterpret_cast/const_cast/static_cast/dynamic_cast

目录 1. cast 2. reinterpret_cast 3. const_cast 3.1 加上const的情况 3.2 去掉const的情况 4. static_cast 4.1 基本类型之间的转换 4.2 void指针转换为任意基本类型的指针 4.3 子类和父类之间的转换 5. dynamic_cast 5.1 RTTI(Run-time Type Identification) 1.…

Selenium实现多页面切换

当使用 Selenium 进行自动化测试或爬取数据时,有时需要处理多个页面之间的切换。以下是一些可能需要多页面切换的情况: 1、打开新窗口/页面: 在当前页面上点击链接、按钮或执行某些操作时,可能会打开一个新的窗口或页面。此时&a…

【element优化经验】怎么让element-ui中表单多语言切换排版不乱

目录 前言: 痛点: 1.左对齐,右对齐在中文和外语情况下字数不同,固定宽度会使名称换行,不在整行对齐,影响美观。 2.如果名称和输入框不在一行,会使页面越来越长 3.label-width值给变量&#…

随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

环境:springboot-2.7.5 配置文件配置静态资源映射 springboot配置静态资源映射方式是通过 WebMvcAutoConfiguration 实现的 spring: # resources: # # 自springboot 2.5.5之后,该属性已经被废弃,使用spring.web.resources.static-locat…

爬虫逆向你应该懂得Javascript知识

背景 大家在学习爬虫逆向的时候,一般都会涉及到对js源文件进行代码扣去,但是有的时候,你最好有js基础,能发现加密或者解密在那个位置,或者是能用python改写js代码,这就对个人的Javascript的能力有一定要求…

Switch的使用及其注意事项

注意第五点要看清,case执行完后匹配没有成功,如过有Default,将会执行Default,如果有case在Default之后,而且Default没有break语句,那么将会继续执行case的语句,此时case中的常量表达式只起语句标…

【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块

文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块: 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分,还有几个重要的工具类模块: Excel 配置导表工具GM 指令测试机器人…

系列一、Spring整合MyBatis不忽略mapper接口同目录的xxxMapper.xml

一、概述 默认情况下maven要求我们将xml配置、properties配置等都放在resources目录下,如果我们强行将其放在java目录,即将xxxMapper.xml和xxxMapper接口放在同一个目录下,那么默认情况下maven打包时会将这个xxxMapper.xml文件忽略掉&#xf…

【办公常识_1】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

【标注数据】labelme的安装与使用

这里写目录标题 下载标数据 下载 标数据 打开自动保存 创建矩形

NSGA-II求解微电网多目标优化调度(MATLAB)

一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的…

Design Guidelines for 100 Gbps

文章目录 Stratix V GT Transceiver ChannelsCFP2 Host Connector Assembly and PinoutStratix V GT to CFP2 Interface Layout DesignBoard Stack Up DimensionsExample Design Channel PerformanceSimulation Results for Stratix V GT to CFP2 Connector Layout Design Desi…

特征工程完整指南 - 第二部分

苏米特班迪帕迪亚 照片由Dan Cristian Pădureş在Unsplash上拍摄 一、说明 DATA,通常被称为原油,需要经过加工和清洁才能有效地用于各种用途。正如我们不直接使用来自其来源的石油一样,数据也经过类似的处理以提取其真正价值。 二、特征选…

LabVIEW中如何达到NI SMU最大采样率

LabVIEW中如何达到NI SMU最大采样率 NISMU的数字化仪功能对于捕获SMU详细的瞬态响应特性或表征待测设备(DUT)响应(例如线性调整率和负载调整率)至关重要。没有此功能,将需要一个外部示波器。 例如,假设在…

Docker start/stop/restart 命令

docker start:启动一个或多个已经被停止的容器。 docker stop:停止一个运行中的容器。 docker restart:重启容器。 语法 docker start [OPTIONS] CONTAINER [CONTAINER...]docker stop [OPTIONS] CONTAINER [CONTAINER...]docker restart…

设计循环队列(详解)

呀哈喽,我是结衣 今天给大家带来的内容如标题所述,我们来设计环形队列,虽然队列没有讲,但是我就是想讲啊。那么环形队列现在开始。 队列的属性 在设计环形队列前,我们先要了解队列的特点(先进先出&#x…

鸿蒙(HarmonyOS)应用开发——ArkTs学习准备

介绍 前面我们已经介绍了,如何安装HarmonyOS的IDE ,那么现在我们来介绍一下。HarmonyOS 开发的语言——ArkTs. ArkTS 是HarmonyOS的开发语言,他是typescript 的扩展,而typesrcipt是javascript的超集,如果你不太熟悉typescript语法…

qml Loader使用介绍

QML Loader 是 Qt Quick 框架中的一个元素,它允许你动态地加载和卸载 QML 组件。Loader 的作用主要体现在以下几个方面: 延迟加载:Loader 允许你在需要时才加载组件,而不是在应用程序启动时一次性加载所有组件。这样可以加快应用程序的启动时间,因为它只需要初始化用户当前…

MIT_线性代数笔记:列空间和零空间

目录 前言子空间综述列空间 Column space零空间(或化零空间)Nullspaceb 值的影响 Other values of b 前言 本节继续研究子空间,特别是矩阵的列空间(column space)和零空间(nullspace)。 子空间…