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{

    @Override
    public 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;
    }

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity Toggle,初始时默认不选中,若选中则不可取消选中。不写码实现其效果

实现效果: 初始默认时: 选中时: 零代码实现: 步骤1 步骤2 步骤3

日常生活小技巧 -- Win10 系统安装 Linux 子系统

最新要在win10系统安装linux子系统,看一下教程。 参看:Win10 系统安装 Linux 子系统教程(WSL2 Ubuntu 20.04 Gnome 桌面 ) 1、开启开发人员模式 2、适用于linux的Windows子系统 勾选下图三个选项,重启。 3、安装 Ubuntu 创建…

Leetcode199. 二叉树的右视图

Every day a Leetcode 题目来源:199. 二叉树的右视图 解法1:层序遍历 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 按层序遍历,将每层的…

『接口测试干货』| Newman+Postman接口自动化测试完整过程

『接口测试干货』| NewmanPostman接口自动化测试完整过程 1 Newman简介2 如何安装Newman?2.1 安装NodeJs2.2 安装Newman2.2 解决Newman不是内部命令 3 Newman使用3.1 Newman如何运行集合?3.2 如何查看帮助文档?3.3 环境变量设置3.4 关于全局变…

Win10系统Steam错误代码118的解决教程

在Win10系统中,用户可以打开Steam平台搜索喜欢的游戏,点击开始畅玩。但是,有用户反映自己在Steam平台上操作的时候,收到了错误代码118的提示,导致自己没有办法正常进行操作。接下来小编给大家详细介绍关于解决Win10系统…

MariaDB(基础信息)

文章目录 一、MariaDB1、基本信息2、存储引擎3、兼容性》MySQL、Postgres、MongoDB 和 Oracle4、直接连接其他数据源5、等等等。。。。。。。。。。。。。。。。。。。。。 二、操作和mysql一样参考文章 --------------------机翻内容仅供参考------------------------- 一、…

linux基础5:linux进程1(冯诺依曼体系结构+os管理+进程状态1)

冯诺依曼体系结构os管理 一.冯诺依曼体系结构:1.简单介绍(准备一)2.场景:1.程序的运行:2.登录qq发送消息: 3.为什么需要内存:1.简单的引入:2.计算机存储体系:3.内存的意义…

【广州华锐互动】利用VR体验环保低碳生活能带来哪些教育意义?

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进了我们的生活。从游戏娱乐到教育培训,VR技术的应用范围越来越广泛。而在这个追求绿色、环保的时代,VR技术也为我们带来了一种全新的环保低碳生活方式。让我们一起走进…

企业微信web登录实现

企业微信登录流程 实现方式 使用js-sdk 使用 wecom/jssdk 初始化企业微信登录组件。 为了满足网站定制化的需求,我们支持将企业微信登录组件内嵌到开发者的网站中。用户使用企业微信登录授权后,登录组件将 auth code 返回给网站。 企业微信登录组件主…

Android开发从0开始(广播)

应用广播 发送标准广播的三步骤 发送标准广播: //发送标准广播 Intent intent new Intent("com.dongnaoedu.chapter09.standard"); sendBroadcast(intent); 定义广播接受者: public class StanderdReceiver extends BroadcastReceiver { public s…

ECharts与DataV:数据可视化的得力助手

文章目录 引言一、ECharts简介优势:劣势: 二、DataV简介优势:劣势: 三、ECharts与DataV的联系四、区别与选择五、如何选择根据需求选择技术栈考虑预算和商业考虑 结论我是将军,我一直都在,。! 引…

关于进制的转化

二进制转十进制: 🔰 方法一:二进制转十进制,用各数的码位与位权的乘积之和,说白了就是用从右到左的每个数去乘以2的幂次方(最右边是0),然后就所有的数相加。 补充:位权是…

多模态常见任务介绍

视觉问答(VQA, Visual Question Answer) 目标:给定一个图片以及问题,需要理解图片的内容并基于此用自然语言回答问题。 例如,图像中发生什么事,人物穿的衣服是什么颜色,图像中有多…

在Windows系统上安装git-Git的过程记录

01-上git的官网下载git的windows安装版本 下载页面链接: https://git-scm.com/downloads 选择Standalone Installer的版本进行下载: 这里给大家一全git-2.43.0的百度网盘下载链接: https://pan.baidu.com/s/11HwNTCZmtSWj0VG2x60HIA?pwdut…

【DDS】OpenDDS配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍OpenDDS配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更…

【译】Spring 6 入参数据校验: 综合指南

原文地址:Spring 6 Programmatic Validator: A Comprehensive Guide 一、前言 在 Spring 6.1 中,有一个非常值得注意的重要改进——编程式验证器实现。Spring 长期以来一直通过注解支持声明式验证,而 Spring 6.1 则通过提供专用的编程式验证…

【挑战业余一周拿证】AWS 认证云从业者 - 基础(AWS Certified Cloud Practitioner- Foundational)

一、前言 二、开支记录 三、活动时间 四、活动任务 五、关注订阅号 六、如何报名 Q: 我想参加CSDN 孵化器活动,如何报名? Q: 我想正式报考AWS认证考试,该怎么办? Q: 如何领取考试券? Q: 本次活动考试的费用是…

功率半导体器件CV测试系统

概述 电容-电压(C-V)测量广泛用于测量半导体参数,尤其是MOS CAP和MOSFET结构。MOS(金属-氧化物-半导体)结构的电容是外加电压的函数,MOS电容随外加电压变化的曲线称之为C-V曲线(简称C-V特性),C-V 曲线测试可以方便的确…

申请二级域名

1、登录腾讯云 腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2、进入我的域名,点击主域名 3、点击前往DNSPod管理 4、点击我的域名,然后点击主域名 5、点击添加记录,进行添加二级域名信息 6、添加相应二级域名信息 7、添加后需要进行验证…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果,但很多时候是需要场景自己产恒动态效果,而不是通过鼠标拖动,此时引入一个requestAnimationFrame方法,它实际上是通过定时任务的方式,每隔一点时间改变场景中内容后重新渲…