23种设计模式——适配器模式(Adapter)​详解

  ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式——适配器模式(Adapter)详解
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

二、 数据模型(被适配的对象)

三、适配器实现(核心适配逻辑)

四、使用适配器(Activity代码)

五、适配器模式对应关系


一、背景

你现在可能对于它有些陌生,但是原生安卓app的列表大部分是使用它来实现的!android项目中有太多地方使用过它了(如下图)。正是有了它,才让数据与图片可以在列表中显示。下面,让我们一起揭开它的神秘面纱吧!


二、 数据模型(被适配的对象)

public class User {private String name;  // 用户名private int age;      // 用户年龄// 构造函数public User(String name, int age) {this.name = name;this.age = age;}// 获取用户名public String getName() { return name; }// 获取用户年龄public int getAge() { return age; }
}

这段代码定义了一个简单的User类,包含用户名和年龄两个属性。这个类就是列表中每一列需要显示的数据。


三、适配器实现(核心适配逻辑)

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {private List<User> users;  // 存储用户数据列表// 构造函数,接收数据列表public UserAdapter(List<User> users) {this.users = users;}// 定义ViewHolder,用于缓存视图元素public static class UserViewHolder extends RecyclerView.ViewHolder {TextView nameView;  // 显示姓名的TextViewTextView ageView;   // 显示年龄的TextViewpublic UserViewHolder(View itemView) {super(itemView);// 从布局文件中查找对应的视图组件nameView = itemView.findViewById(R.id.tv_name);ageView = itemView.findViewById(R.id.tv_age);}}// 创建新视图时调用@Overridepublic UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 加载列表项的布局文件View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);return new UserViewHolder(view);}// 将数据绑定到视图上@Overridepublic void onBindViewHolder(UserViewHolder holder, int position) {User user = users.get(position);  // 获取当前位置的数据holder.nameView.setText(user.getName());     // 设置姓名holder.ageView.setText(String.valueOf(user.getAge()));  // 设置年龄}// 返回数据总数@Overridepublic int getItemCount() {return users.size();}
}

这段代码是适配器的核心实现:

  1. 继承RecyclerView.Adapter并指定ViewHolder类型

  2. 在构造函数中接收要显示的数据列表

  3. 实现三个必要方法:创建视图、绑定数据、返回数据量


四、使用适配器(Activity代码)

// 准备测试数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25));
userList.add(new User("李四", 30));// 获取RecyclerView控件
RecyclerView recyclerView = findViewById(R.id.recyclerView);// 设置布局管理器(决定列表如何排列)
recyclerView.setLayoutManager(new LinearLayoutManager(this));// 创建并设置适配器
recyclerView.setAdapter(new UserAdapter(userList));

其实就是页面代码,里面使用了我明定义的列表。这段代码说了适配器的使用:

  1. 准备要显示的数据

  2. 获取列表控件

  3. 设置列表布局方式

  4. 创建适配器并绑定数据


五、适配器模式对应关系

  • ​Target接口​​:RecyclerView.Adapter定义的接口(onCreateViewHolder等方法)

  • ​Adaptee​​:List<User>数据列表(原始数据格式)

  • ​Adapter​​:UserAdapter类(将数据适配为视图)

  • ​Client​​:使用RecyclerView的代码(通过适配器间接使用数据)

这个例子展示了适配器模式如何将数据列表(List<User>)转换为可以在屏幕上显示的列表项视图。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

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

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

相关文章

Vue3源码reactivity响应式篇之Reactive

概览 vue3中reactive用于将普通对象转换为响应式对象&#xff0c;它的实现原理是通过Proxy和Reflect来实现的。具体的实现文件参见packages\reactivity\src\reactive.ts。本文会介绍reactive的相关api如下&#xff1a; reactive&#xff1a;将普通对象转换为响应式对象readonly…

初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决

数据结构专栏 ⬅(click) 大家好&#xff01;我是你们的老朋友——想不明白的过度思考者&#xff01;今天我们要一起探索Java中两个神奇的数据结构&#xff1a;Map和Set&#xff01;准备好了吗&#xff1f;让我们开始这场魔法之旅吧&#xff01;&#x1f3a9; &#x1f3af; 先…

Unreal Engine UStaticMeshComponent

UnrealUnreal Engine - UStaticMeshComponent&#x1f3db; 定义&#x1f3db; 类继承⚡ 关键特性⚙️ 常见配置&#x1f6e0;️ 使用方法&#x1f4da; 在 C 中使用&#x1f4da; 在蓝图中使用&#x1f3ae; 典型应用场景&#x1f4da; 常见子类与用途&#x1f4dd; 小结Unrea…

demo 汽车之家(渲染-筛选-排序-模块抽离数据)

效果图展示&#xff1a;代码截图注释详情实现笔记总体目标&#xff08;按需求点对照代码&#xff09;数据模块化、整体渲染框架、筛选/排序的高亮与行为&#xff0c;全部已在 Index.ets CarData.ets 落地。下面按图片需求 2~4 点逐条总结&#xff0c;并给出关键代码定位与“为…

双重机器学习DML介绍

本文参考&#xff1a; [1]文心一言回答&#xff1b; 一、核心原理与数学框架 双重机器学习&#xff08;Double Machine Learning, DML&#xff09;由Chernozhukov等学者于2018年提出&#xff0c;是一种结合机器学习与传统计量经济学的因果推断框架。其核心目标是在高维数据和非…

【图像算法 - 21】慧眼识虫:基于深度学习与OpenCV的农田害虫智能识别系统

摘要&#xff1a; 在现代农业生产中&#xff0c;病虫害是影响作物产量和品质的关键因素之一。传统的害虫识别依赖人工巡查&#xff0c;效率低、成本高且易出错。本文将介绍如何利用深度学习与OpenCV构建一套高效的农田害虫智能识别系统。该系统能够自动识别10类常见农业害虫&a…

循环神经网络实战:GRU 对比 LSTM 的中文情感分析(三)

循环神经网络实战&#xff1a;GRU 对比 LSTM 的中文情感分析&#xff08;三&#xff09; 文章目录循环神经网络实战&#xff1a;GRU 对比 LSTM 的中文情感分析&#xff08;三&#xff09;前言数据准备&#xff08;与 LSTM 相同&#xff09;模型搭建&#xff08;GRU&#xff09;…

学习游戏制作记录(制作提示框以及使用键盘切换UI)8.21

1.制作装备提示框创建提示框&#xff0c;添加文本子对象&#xff0c;用来描述名称&#xff0c;类型以及属性加成挂载垂直分配组件和文本大小适配组件&#xff0c;这样图像会根据文本大小来调整自己创建UI_ItemTip脚本并挂载在文本框上&#xff1a;[SerializeField] private Tex…

chapter07_初始化和销毁方法

一、简介 一个Bean&#xff0c;在进行实例化之后&#xff0c;需要进行两种初始化 初始化属性&#xff0c;由PropertyValues进行赋值初始化方法&#xff0c;由ApplicationContext统一调用&#xff0c;例如加载配置文件 Bean的初始化与销毁&#xff0c;共有三种方式&#xff08;注…

open webui源码分析6-Function

一、Functions简介 可以把Tools作为依赖于外部服务的插件&#xff0c;Functions就是内部插件&#xff0c;二者都是用来增强open webui的能力的。Functions是轻量的&#xff0c;高度可定制的&#xff0c;并且是用纯Python编写的&#xff0c;所以你可以自由地创建任何东西——从新…

C2039 “unref“:不是“osgEarth::Symbology::Style”的成员 问题分析及解决方法

在osgEarth2.10中实现多线段连续测量功能时,遇到下图中的错误; 经过测试和验证,主要问题出现在下图圈出代码的定义上 图22-1 对于22-1中的两个变量这样定义是错误的。因为Style类没有继承自osg::Referenced,因此不能与osg::ref_ptr配合使用

GitHub 热榜项目 - 日榜(2025-08-19)

GitHub 热榜项目 - 日榜(2025-08-19) 生成于&#xff1a;2025-08-19 统计摘要 共发现热门项目&#xff1a;12 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术热点&#xff1a;1&#xff09;AI原生开发持续爆发&#xff0c;Archon OS、Parlant等…

ingress 配置ssl证书

模拟环境举例&#xff1a; # 生成带 OU 的证书配置文件 cat > csr.conf <<EOF [ req ] default_bits 2048 prompt no default_md sha256 distinguished_name dn[ dn ] C CN ST Beijing L Beijing O YourCompany, Inc. # 组织名称 (必填) OU DevOps De…

Pandas 合并数据集:concat 和 append

文章目录Pandas 合并数据集&#xff1a;concat 和 append回顾&#xff1a;NumPy 数组的拼接使用 pd.concat 进行简单拼接重复索引将重复索引视为错误忽略索引添加多级索引&#xff08;MultiIndex&#xff09;键使用连接&#xff08;Join&#xff09;方式拼接append 方法Pandas …

2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(七)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试上午综合知识科目的选择题,同时附带参考答案、解析和所涉知识点。 2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(一) 2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(…

面向RF设计人员的微带贴片天线计算器

微带贴片天线和阵列可能是仅次于单极天线和偶极天线的最简单的天线设计。这些天线也很容易集成到PCB中&#xff0c;因此通常用于5G天线阵列和雷达等高级系统。这些天线阵列在基谐模式和高阶模式下也遵循一组简单的设计方程&#xff0c;因此您甚至可以在不使用仿真工具的情况下设…

明基RD280U编程显示器深度测评:码农的「第二块键盘」竟然会发光?

文章目录前言一、开箱篇&#xff1a;当理工男遇到「俄罗斯套娃式包装」二、外观篇&#xff1a;深空灰的「代码容器」1. 桌面变形记2. 保护肩颈的人体工学设计三、显示篇&#xff1a;给代码做「光子嫩肤」1. 28寸超大大屏 3:2屏比 4K超清2.专业编程模式&#xff0c;让代码一目…

算法114. 二叉树展开为链表

题目&#xff1a;给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。…

智慧能源管理系统:点亮山东零碳园区的绿色引擎

一、概述在全球积极践行“双碳”目标的时代浪潮下&#xff0c;山东作为经济大省&#xff0c;正全力推动产业的绿色变革&#xff0c;零碳园区建设成为其中的关键一环。《山东省零碳园区建设方案》明确规划&#xff0c;到2027年建成15个左右省级零碳园区 &#xff0c;到2030年进一…

分布式日志分析平台(ELFK 与 EFK)理论

一、日志分析平台核心概念在分布式系统中&#xff0c;日志是系统运行状态监控、问题排查和业务分析的重要依据。随着系统规模扩大&#xff0c;单机日志管理方式已无法满足需求&#xff0c;分布式日志分析平台应运而生。其核心目标是实现日志的集中收集、统一处理、高效存储和可…