前言

Adapter设计模式,允许客户端使用接口不兼容的类。

昨天收拾一些以前的东西,发现了藏在柜子里的一条线,这条线叫做OTG。这条线的一端是micro-usb的输出口,另一端是usb的输入口。这条线,就是Adapter。手机如果想要使用U盘,会发现这个U盘的usb输出口太大了,根本插不进手机的接口。怎么办呢?使用适配器就好!

只要手机插上OTG,U盘再接上OTG,这样手机就可以欢快地使用U盘啦。

这是硬件的适配器,手机作为客户端,原本不能使用接口不兼容的U盘。手机只认它能认的接口,micro-usb也好,type-c也好,只要是同一个接口,它都认。OTG作为适配器,它要有一端,能让手机认识,还要有另一端能接受它想认得的东西(U盘)。

在软件开发中,OTG能给我们带来什么启示呢?

1, 手机认得OTG的一端。

明确客户端需要的类,让Adapter去继承/实现客户端需要的类,这样客户端就能认Adapter了。

2, OTG能认到U盘。

Adapter能获取到被适配对象的信息,方法有二:在Adapter中放置一个对象;让Adapter继承被适配类。

3, 手机通过OTG读取U盘的信息。

Adapter需要为客户端实现特定的调用,让其可以操作被适配对象。

Java中的Arrays

Java中Arrays.asList()返回一个适配器。

客户端能使用的是List类型,而不是一个数组,这时候,就可以使用Arrays.asList,将它转成客户端需要的。

Arrays实现了一个内部类ArrayList,这个有别于java.util.ArrayList,Arrays.ArrayList不能对List进行add,remove等操作。这么做可以保证数据的一致性,在数组中做出的修改,在Adapter中对应做出修改。同时还节省空间/时间,不需要新建一个数组,因为Arrays.ArrayList内部存储了一个指向这个数组的成员,既不需要开辟新的空间,又不需要复制操作。

用Adapter设计模式来看,List为客户端需要的类,Arrays.ArrayList为适配器,数组为被适配对象。

以下代码去掉了Arrays.ArrayList的部分实现:

  1. @SafeVarargs
  2. @SuppressWarnings("varargs")
  3. public static <T> List<T> asList(T... a) {
  4. return new ArrayList<>(a);
  5. }
  6. private static class ArrayList<E> extends AbstractList<E>
  7. implements RandomAccess, java.io.Serializable
  8. {
  9. private static final long serialVersionUID = -2764017481108945198L;
  10. private final E[] a;
  11. ArrayList(E[] array) {
  12. a = Objects.requireNonNull(array);
  13. }
  14. @Override
  15. public E get(int index) {
  16. return a[index];
  17. }
  18. @Override
  19. public E set(int index, E element) {
  20. E oldValue = a[index];
  21. a[index] = element;
  22. return oldValue;
  23. }
  24. ...
  25. }

Android中的Adapter

安卓中使用的Adapter符合Adapter设计模式吗?比如Adapter,ListAdapter,ArrayAdapter。

不是。正如[1]中所指出的

There are plenty of classes in the world named similarly to GoF that have nothing to do with those patterns

虽然名字是XXXAdapter,实际上它扮演的更像是MVP中的Presenter。其中还使用了观察者的设计模式。想要自定义ListView的item样式,可以使用这个Adapter,它会帮你处理数据,帮你处理View。这里Adapter的作用是:让模型adapt视图。

参考链接

  1. https://stackoverflow.com/questions/41626980/are-android-adapters-an-example-of-adapter-design-pattern

【设计模式】Adapter的更多相关文章

  1. java设计模式—Adapter模式

    1.核心意图:     将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...

  2. 设计模式Adapter模式的五分钟

    五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...

  3. [C# 设计模式] Adapter - 适配器模式(两种)

    Adapter - 适配器模式 序 现实生活中,我们常用到适配器. 你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗? 你平时想将三口插座插进二口插座里面,不也需要一个适配器吗? 整 ...

  4. 第9月第15天 设计模式 adapter mvc

    1. 有一道iOS面试题,iOS中都有什么设计模式?很少有答案说包括adapter. gof 书中adapter模式有以下内容: 实现: ... b ) 使 用 代 理 对 象 在这种方法中, T r ...

  5. 设计模式-Adapter(结构型模式)针对第三方库 函数 接口不匹配的问题,分为类模式 与 对象模式 两种

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //****************************类模式的Adaptr*********************** ...

  6. 设计模式——Adapter Pattern 适配器模式

    我第一次接触设计模式,选取了四大类型里面的结构型,这类型的特点是关注类&对象之间的组合(使用继承),我从中选取适配器模式来具体学习. 一.适配器模式(Adapter Pattern)定义: 适 ...

  7. 一天一个设计模式——Adapter适配器模式(Wrapper模式)

    一.模式说明 在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连 ...

  8. C++设计模式-Adapter适配器模式

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  9. C++设计模式-Adapter适配器模式(转)

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  10. 2.设计模式---Adapter模式

    Adapter模式也就是适配器模式,最常见的就是这个:码农必备-------------->笔记本电源适配器: 那么这玩意到底是干嘛的?? 手工画图一张: 220V--------------- ...

随机推荐

  1. System 类初探

    System 类 操作方法 取得当前的系统时间 currentTemiMillis() public static long currenTimeMillis() ; 实例: 统计某些操作的执行时间 ...

  2. Linux 下Postgresql 命令:

    关闭:service postgresql stop 启动:service postgresql start 启动数据库:pg_ctl start -D /data/postgres 重启数据库: p ...

  3. 【转载】Android 的 Handler 机制实现原理分析

    handler在安卓开发中是必须掌握的技术,但是很多人都是停留在使用阶段.使用起来很简单,就两个步骤,在主线程重写handler的handleMessage( )方法,在工作线程发送消息.但是,有没有 ...

  4. Xcode修改工程文件名字

    http://stackoverflow.com/questions/8262613/renaming-xcode-4-project-and-the-actual-folder

  5. Nginx文章

    https://www.cnblogs.com/qfb620/p/5508468.html https://www.cnblogs.com/jiangwangxiang/p/8481661.html ...

  6. 02-webpack的基本配置-运行webpack

    1安装webPack的方式 第一次全局安装 npm i webpack -g 第一次安装了之后以后就不需要在安装了 在项目根录中运行 npm i webpack --save-dev 安装到项目依赖中 ...

  7. 10. Go语言—for循环

    一.for循环 for 初始化语句;条件判断;变量修改 for i := 0; i < 100; i++{ fmt.Printf('i=%d\n',i) } // C 的 while 一样 fo ...

  8. 2019 SDN上机第一次作业

    2019 SDN上机第一次作业 1. 安装轻量级网络仿真工具Mininet 安装Mininet的步骤 - git clone git://github.com/mininet/mininet - cd ...

  9. Linux学习笔记-第15天 还真是看书不如做实验

    自己多操作几遍还是有好处的,看跟练还是不一样.突然有点庆幸自己考试时间被改了.月底考试的话估计会有点悬.加油吧

  10. 【BZOJ3534】[SDOI2014] 重建(矩阵树定理)

    点此看题面 大致题意: 给你一张图,每条边有一定存在概率.求存在的图刚好为一棵树的概率. 矩阵树定理是什么 如果您不会矩阵树定理,可以看看蒟蒻的这篇博客:初学矩阵树定理. 矩阵树定理的应用 此题中,直 ...