首页 > 编程语言 >Glide源码阅读之适配器模式【ArrayAdapterInterface<T>】

Glide源码阅读之适配器模式【ArrayAdapterInterface<T>】

时间:2023-09-19 13:33:19浏览次数:52  
标签:ArrayAdapterInterface return int 适配器 接口 源码 array public


定义

菜鸟教程

介绍
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何解决:继承或依赖(推荐)。

关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

大话设计模式

Glide源码阅读之适配器模式【ArrayAdapterInterface<T>】_面向对象编程

类适配器和对象适配器

怎么使用适配器模式

  1. 使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式?
  2. 两个类所做的事情相同或相似,但是具有不同的接口时要使用它

Glide适配器模式应用

涉及接口类如下:

  • ArrayAdapterInterface
  • ByteArrayAdapter
  • IntegerArrayAdapter

ArrayAdapterInterface

com.bumptech.glide.load.engine.bitmap_recycle.ArrayAdapterInterface
用于处理基元数组类型操作的接口。

/**
 * Interface for handling operations on a primitive array type.
 *
 * @param <T> Array type (e.g. byte[], int[])
 */
 用于处理基元数组类型操作的接口。
interface ArrayAdapterInterface<T> {

  /** TAG for logging. */
  String getTag();

  /** Return the length of the given array. */
  int getArrayLength(T array);

  /** Allocate and return an array of the specified size. */
  T newArray(int length);

  /** Return the size of an element in the array in bytes (e.g. for int return 4). */
  int getElementSizeInBytes();
}

ByteArrayAdapter

com.bumptech.glide.load.engine.bitmap_recycle.ByteArrayAdapter
用于处理基本字节数组的适配器。

/** Adapter for handling primitive byte arrays. */
用于处理基本字节数组的适配器。
@SuppressWarnings("PMD.UseVarargs")
public final class ByteArrayAdapter implements ArrayAdapterInterface<byte[]> {
  private static final String TAG = "ByteArrayPool";

  @Override
  public String getTag() {
    return TAG;
  }

  @Override
  public int getArrayLength(byte[] array) {
    return array.length;
  }

  @Override
  public byte[] newArray(int length) {
    return new byte[length];
  }

  @Override
  public int getElementSizeInBytes() {
    return 1;
  }
}

IntegerArrayAdapter

com.bumptech.glide.load.engine.bitmap_recycle.IntegerArrayAdapter
用于处理原语int数组的适配器。

/** Adapter for handling primitive int arrays. */
用于处理原语int数组的适配器。
@SuppressWarnings("PMD.UseVarargs")
public final class IntegerArrayAdapter implements ArrayAdapterInterface<int[]> {
  private static final String TAG = "IntegerArrayPool";

  @Override
  public String getTag() {
    return TAG;
  }

  @Override
  public int getArrayLength(int[] array) {
    return array.length;
  }

  @Override
  public int[] newArray(int length) {
    return new int[length];
  }

  @Override
  public int getElementSizeInBytes() {
    return 4;
  }
}

小计

适配器模式在理解上很容易,但是在结合实际业务场景和版本迭代维护进行设计或解析就比较复杂了,比如Glide这个很典型的适配器应用,如果不进行业务的深入分析不太容易理解设计者这么使用适配器的具体意图。但是从这个结构上看是如此的简单易懂。但如果进行自己的项目应用开发不太容易找到合适的使用场景。

根据适配器的定义和使用场景理解。它一般是用于后期维护使用居多。例如Glide多年的版本迭代,Android系统版本迭代等等这些迭代次数多且业务复杂的系统软件或组件使用比较多一些。一般应用上反倒没有合适的应用场景了。

拓展

适配器的合理使用是比较考验开发者对于业务理解和业务目标的明确性。同时在解析具体的适配器时需要涉及具体的业务这提高了解析理解的复杂性。本章就不展开了。熟悉其典型结构即可。Glide也有其他适配器方式的使用,不过都不是那么典型。后期如果有具体的业务解析后再结合业务场景说明这些适配器的使用意图

自研产品推荐

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

为了更好服务大家把之前的公众号和软件激活结合,如有疑问请大家反馈到公众号即可,下个版本30%以上的更新会来自公众号的反馈。

嗯!先解释不上服务端原因,API调试工具的绝大多数时候就是一个数据模型、数据处理、数据模型理解共识的问题解决工具,所以作者结合自己十多年开发使用的一些痛点来打造的,再加上服务端开发一般是面向企业的,作者目前没有精力和时间去打造企业服务。再加上没有资金投入所以服务端开发会滞后,至于什么时候会进行开发,这个要看募资情况和用户反馈综合考虑。虽然目前国内有些比较知名的api工具了,但作者使用后还是觉得和实际使用场景不符。如果有相关吐槽也可以在作者的公众号里反馈蛤!

下面是一段smartApi使用介绍:

Glide源码阅读之适配器模式【ArrayAdapterInterface<T>】_源码_02

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn


标签:ArrayAdapterInterface,return,int,适配器,接口,源码,array,public
From: https://blog.51cto.com/u_16264967/7524378

相关文章

  • Glide源码阅读之策略模式2【DownsampleStrategy】
    策略模式二DownsampleStrategy包路径:com.bumptech.glide.load.resource.bitmap.DownsampleStrategy指示对图像进行下采样时使用的算法。DownsampleStrategy不提供任何关于输出大小的保证。行为将不同,取决于ResourceDecoder使用的策略和Android版本的代码运行。使用DownsampleStrat......
  • Glide源码阅读之工厂模式4总结
    工厂模式的应用比较多;变化形态也是各种各样。但经过这段时间的解读。大概可以用浓缩为1、不是使用new创建对象;2、没有明显build方法创建对象;3、带xxxFactory的几乎都满足工厂模式。当然第3点比较明显。如果不带xxxFactory等这样的标识那看看是否有implements、extends。而且内......
  • Glide源码阅读之状态模式[SingleRequest<R>.Status]
    前言前面写完策略模式,接着写状态模式;在开始接触这两个模式的时候我也很疑惑,这两个设计模式很相似,用法也很类似。好一段时间我都没有区分这两者的区别。在使用的时候也不知道怎么选择,后来慢慢的加深理解也就总结出规律了。先看看状态模式的经典结构状态模式介绍《Android源码设计模......
  • Glide源码阅读之策略模式4总结
    《Android源码设计模式解析与实践》定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化使用场景针对同一类型问题的多种处理方式。仅仅是具体行为有差别时需要安全地封装多种同一类型的操作时出现同一抽......
  • Glide源码阅读之工厂模式2【DiskCache.Factory】
    DiskCache.Factory包路径:com.bumptech.glide.load.engine.cache.DiskCachecom.bumptech.glide.load.engine.cache.DiskCache.Factory/**Aninterfaceforwritingtoandreadingfromadiskcache.*/一种向磁盘缓存写入和从磁盘缓存读取数据的接口。publicinterfaceDiskCa......
  • Glide源码阅读之工厂模式1【ModelLoaderFactory】【ModelLoader】
    使用场景介绍摘自菜鸟教程|设计模式|工厂模式意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个......
  • Glide源码阅读之建造者(builder)模式3【RequestOptions】【BaseRequestOptions】
    官方定义本来解析完GlideBuilder、RequestBuilder就已经觉得建造者模式用的变化有些大了,但随着解析的进行发现还要下面的这两种变种应用。先解析出来给大家看看,说不定在某些场景下能启发读者使用这种模式应用方式builder模式应用变化一结构:publicstaticRequestOptionssizeXXXX(p......
  • 万字长文深度解读Java线程池,硬核源码分析
    前言本文将深入分析Java线程池的源码,包括线程池的创建、任务提交、工作线程的执行和线程池的关闭等过程。通过对线程池源码的解析,我们能够更好地理解线程池的原理和机制,为我们在实际开发中合理使用线程池提供指导。文章内容较长,建议找个安静的环境慢慢细读,由于线程池涉及的内容......
  • 云HIS医院信息化管理系统源码:集团化管理,多租户机制,满足医院业务需求
    随着云计算、大数据、物联网等新兴技术的迅猛发展,HIS模式的理念、运行机制更新,衍生出了新的HIS模式——云HIS。云HIS是基于云计算、大数据、互联网等高新技术研发的医疗卫生信息平台,它实现了医院信息化从局域网向互联网转型,并重新定义了医疗卫生信息化建设的理念、框架、功能以及运......
  • 设计模式(六)适配器
    一、定义将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。适配器模式是一种结构型模式。二、描述包含以下三个角色:1、Target(目标抽象类):目标抽象类定义了客户所需要的接口,可以是一个抽象类或接口,也可以是一个具体的类,由于C#不支持多继......