type
status
date
slug
summary
tags
category
icon
password
😀
适配器模式又称为包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。一般类名带Adapter或Wrapper的都是适配器模式

使用场景

  1. 期望在原有接口的基础上拓展。
  1. 需要使用一个已有或新建的类,但这个类又不符合系统的接口。

成员

  • Target:适配器接口,即目标角色,定义把其他类转换为何种接口,也就是客户端期望的接口
  • Adaptee:即源角色,一般是已存在的类,需要适配新的接口
  • Adapter:具体适配器,实现适配器接口,把源角色接口转换为目标角色期望的接口
总结下就是:Adaptee通过Adapter变成Target需要的类

优缺点

优点:
  1. 让两个没有任何关系的类在一起运行
  1. 增加了类的透明性(客户端target通过适配器adapter可以透明地调用目标adaptee接口。)
  1. 提高了复用度
  1. 灵活性好。如果不想用就可以卸载适配器
 
缺点:增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。相信写过recyclerview的都深有体会,有继承、重写、泛型等等,每次写都会感觉很麻烦。

结构

适配器模式有两种写法,分别是类适配器和对象适配器。
类适配器是adapter继承adaptee,从而使用adaptee中的属性和方法。
对象适配器是在创建适配器时将adaptee对象传入adapter中,使用对象的属性和方法。
类适配器的结构为:
notion image
对象适配器的结构为:
notion image

模板代码

类适配器:
对象适配器:

使用实例

android中ListView、RecyclerView都使用了适配器模式,为了简化说明下面使用ListView作为实例。
ListView把高度定制化的ItemView和ListView分开。ItemView通过一个Adapter和ListView联系到一起。解耦而不失高度可定制。
ListView只关心它的每个ItemView,而不关心这个ItemView具体显示的是什么。而我们的数据源存放的是要显示的内容,它保存了每一个ItemView要显示的内容。ListView和数据源之间没有任何关系,这时候,需要通过适配器,适配器提供getView方法给ListView使用,每次ListView只需提供位置信息给getView函数,然后getView函数根据位置信息向数据源获取对应的数据,根据数据返回不同的View。
ListView的简单实现
1、目标接口:
2、对象适配器,将数据源转换为View
3、ListView

📎 参考

MVVM前置(2)——LiveData外观模式(ContextImpl)
LuluNotion
LuluNotion
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
🎉NotionNext 4.0即将到来🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏