经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
【设计模式】Adapter
来源:cnblogs  作者:楷哥  时间:2019/7/25 8:38:45  对本文有异议

前言

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

原文链接:http://www.cnblogs.com/zhouzekai/p/11240406.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号