zoukankan      html  css  js  c++  java
  • 【设计模式】Adapter

    前言

    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的部分实现:

    @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;
        }
    
        ...
    }
    

    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
  • 相关阅读:
    Windows下MySQL8.0.23的下载与安装简单易用
    【转】decimal double的区别
    【转】.NET垃圾回收
    vs2010 断点调试故障 反编译插件引起的
    【摘】别人对面向对象的理解
    【转】C# indexof
    【转】八大排序算法总结
    【转】JS windows.open()详解
    【转】with as
    【转】SQL Server的几种约束
  • 原文地址:https://www.cnblogs.com/zzk0/p/11240406.html
Copyright © 2011-2022 走看看