欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【设计模式】Adapter

程序员文章站 2022-03-23 13:49:49
前言 Adapter设计模式,允许客户端使用接口不兼容的类。 昨天收拾一些以前的东西,发现了藏在柜子里的一条线,这条线叫做OTG。这条线的一端是micro usb的输出口,另一端是usb的输入口。这条线,就是Adapter。手机如果想要使用U盘,会发现这个U盘的usb输出口太大了,根本插不进手机的接 ......

前言

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需要为客户端实现特定的调用,让其可以操作被适配对象。

【设计模式】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://*.com/questions/41626980/are-android-adapters-an-example-of-adapter-design-pattern