Adapter设计模式,容许客户端使用接口不兼容的类。java
昨天收拾一些之前的东西,发现了藏在柜子里的一条线,这条线叫作OTG。这条线的一端是micro-usb的输出口,另外一端是usb的输入口。这条线,就是Adapter。手机若是想要使用U盘,会发现这个U盘的usb输出口太大了,根本插不进手机的接口。怎么办呢?使用适配器就好!android
只要手机插上OTG,U盘再接上OTG,这样手机就能够欢快地使用U盘啦。设计模式
这是硬件的适配器,手机做为客户端,本来不能使用接口不兼容的U盘。手机只认它能认的接口,micro-usb也好,type-c也好,只要是同一个接口,它都认。OTG做为适配器,它要有一端,能让手机认识,还要有另外一端能接受它想认得的东西(U盘)。数组
在软件开发中,OTG能给咱们带来什么启示呢?dom
1, 手机认得OTG的一端。ide
明确客户端须要的类,让Adapter去继承/实现客户端须要的类,这样客户端就能认Adapter了。ui
2, OTG能认到U盘。设计
Adapter能获取到被适配对象的信息,方法有二:在Adapter中放置一个对象;让Adapter继承被适配类。code
3, 手机经过OTG读取U盘的信息。对象
Adapter须要为客户端实现特定的调用,让其能够操做被适配对象。
Java中Arrays.asList()返回一个适配器。
客户端能使用的是List
Arrays实现了一个内部类ArrayList,这个有别于java.util.ArrayList,Arrays.ArrayList不能对List进行add,remove等操做。这么作能够保证数据的一致性,在数组中作出的修改,在Adapter中对应作出修改。同时还节省空间/时间,不须要新建一个数组,由于Arrays.ArrayList内部存储了一个指向这个数组的成员,既不须要开辟新的空间,又不须要复制操做。
用Adapter设计模式来看,List
如下代码去掉了Arrays.ArrayList的部分实现:
@SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } @Override public E get(int index) { return a[index]; } @Override public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } ... }
安卓中使用的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视图。