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

news2024/9/25 21:29:50

至诚之道,可以前知

一,定义

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

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

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

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

相关文章

烫伤事件屡有发生,觅光推脱责任,称是用户操作失误

提及“双十一”“直播间”等关键词,人们常常将其与“低价”“薅羊毛”等字眼挂钩。而在近日,科技美容品牌AMIRO觅光(下称“觅光”)却上演了一出“反向薅羊毛”的戏码,因线上线下渠道相差超千元的价格差饱受争议。 自横…

Jackson无缝替换Fastjson

目录 文章目录 一,Fastjson到Jackson的替换方案方案代码序列化反序列化通过key获取某种类型的值类型替换 二,Springboot工程中序列化的使用场景三,SpringMVC框架中的Http消息转换器1,原理:2,自定义消息转换…

FinGPT:金融垂类大模型架构

Overview 动机 架构 底座模型: Llama2Chatglm2 Lora训练 技术路径 自动收集数据并整理 指令微调 舆情分析 搜新闻然后相似搜索 检索增强架构 智能投顾 Hugging face 地址 学术成果及未来方向 参考资料

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…

使用 NVProf 检测 CUDA kernel 的 bank conflict

使用 NVProf 检测 CUDA kernel 的 bank conflict NVProf 指令 使用 NVProf 可以对 bank conflict 进行检测: nvprof --events shared_ld_bank_conflict,shared_st_bank_conflict <app> [args...]其中: --events 选项指定的 shared_ld_bank_conflict,shared_st_bank_c…

【Django使用】10大章31模块md文档,第5篇:Django模板和数据库使用

当你考虑开发现代化、高效且可扩展的网站和Web应用时&#xff0c;Django是一个强大的选择。Django是一个流行的开源Python Web框架&#xff0c;它提供了一个坚实的基础&#xff0c;帮助开发者快速构建功能丰富且高度定制的Web应用 全套Django笔记直接地址&#xff1a; 请移步这…

camera-caps:Jetson设备上的一种实用的V4L2可视化界面

camera-caps&#xff1a;Jetson设备上的一种实用的V4L2可视化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要选择tag 5.x版本

【基础知识】AB软件RSLinx的版本说明

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 之前对AB的软件了解比较少&#xff0c;在工作中未接触过&#xff0c;最近一次现场勘察时&#xff0c;有很多中控系统都是AB的&#xff0c;借此机会对AB软件有了些许了解。 一、RSLinx是什么软件&#xff1f; RSLinx是…

【LeetCode刷题-回溯】-- 46.全排列

46.全排列 方法&#xff1a;回溯法 一种通过探索所有可能的候选解来找出所有的解的算法&#xff0c;如果候选解被确认不是一个解&#xff0c;回溯法会通过在上一步进行一些变化抛弃该解&#xff0c;即回溯并且再次尝试 使用一个标记数组表示已经填过的数 class Solution {pu…

vue3自定义拖拽指令

<template><div v-move class"box"></div> </template><script setup lang"ts"> import { Directive } from vue const vMove:Directive (el:HTMLElement) >{const mousedown (e:MouseEvent) >{// 鼠标按下const s…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

redis运维(十八)pipeline

一 pipeline 流水线 说明&#xff1a; 这里讲解的不是jenkins的pipeline流水线这里pipeline: 管道 redis为什么要提供pipeline功能 事务和pipeline ① pipeline的理念 强调&#xff1a;单纯的pipeline跟事务没有关系redis-cli --pipe --> 使用了pipeline机制说明&a…

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

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

CAD图纸设计在线协同、CAD图纸设计在线协同方案?

CAD图纸设计在线协同、CAD图纸设计在线协同方案&#xff1f; CAD图纸设计在线协同&#xff0c;在企业产品研发效能的提升中发挥着重要作用&#xff0c;技术应用的深入发展为不同场景的协作带来了全新的应用模式&#xff0c;工业设计领域亦是如此。 在CAD图纸设计与管理过程中&a…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0…

【分布式】小白看Ring算法 - 03

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA开发的一种用于多GPU间…

SQL进阶学习

1.[NISACTF 2022]join-us sql报错注入和联合注入 过滤&#xff1a; as IF rand() LEFT by updatesubstring handler union floor benchmark COLUMN UPDATE & sys.schema_auto_increment_columns && 11 database case AND right CAST FLOOR left updatexml DATABA…

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网&#xff1a;2、注意&#xff1a; 2、安装1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。2、开始安装&#xff0c;然后下一步3、可以在此处自定义地址&#xff0c;然后下一步4、根据系统版本选择&#xff0c;然后下一步…

Linux:虚拟机安装Ubuntu系统

一、下载Ubuntu 地址&#xff1a;https://cn.ubuntu.com/download/desktop 二、安装 以上配置完成后&#xff0c;点击完成按钮&#xff0c;接下来就是一段较长时间的等待安装过程。 安装完成后&#xff0c;还有一些系统性配置。 系统配置非常简单&#xff0c;全部next即可。…

开源 GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台)

GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台) 讨论群v:&#x1f680;18601938676 一、AI人工智能开发-------------面临的问题和挑战 1. GPU管理难题 1.1 资源管理难&#xff1a;算力资源昂贵&#xff0c;但是缺乏有效管理&#xff0c;闲置情况严重。 1.2 用户…