实际应用delegate做好api简洁设计——从commons-io排序器想开

简介: 我们已经知道,在完成一个通用功能的设计时,必然会抽象并且隔离功能级别,把最一般的功能抽象出来,放到接口里去,具体实现接口的类完成具体功能。因为所有的具体实现都有共同的接口,虽然功能实际不同,但是抽象含义相似,因此在抽象级别,其他类调用时就可以把最抽象的接口作为代理(委托)来调用,思路简单清晰。 在

我们已经知道,在完成一个通用功能的设计时,必然会抽象并且隔离功能级别,把最一般的功能抽象出来,放到接口里去,具体实现接口的类完成具体功能。因为所有的具体实现都有共同的接口,虽然功能实际不同,但是抽象含义相似,因此在抽象级别,其他类调用时就可以把最抽象的接口作为代理(委托)来调用,思路简单清晰。

在commons-io这个开源框架中,封装了对io的基本操作,其中org.apache.commons.io.comparator包就是经典的设计典范,comparator顾名思义就是为了提供一系列的文件排序器,辅助排序。这里我把结构图画一下:

image

一个AbstractFileComparator抽象类完成了一层包内抽象,直接实现接口Comparator<File>,并且提供了sort方法完成了通过比较的排序功能:

public File[] sort(File... files) {
        if (files != null) {
            Arrays.sort(files, this);
        }
        return files;
    }

public List<File> sort(List<File> files) {
        if (files != null) {
            Collections.sort(files, this);
        }
        return files;
    }

 

 

 

 

所有的具体排序器实现都继承了这个AbstractFileComparator抽象类,实现compare方法,完成各自的比较,比如有根据文件大小比较的SizeFileComparator,有根据修改时间比较的LastModifiedFileComparator等等。值得一提的就是用到了委托的ReverseComparator和CompositeFileComparator,Reverse顾名思义就是反转排序,默认的排序器都是升序的,谁小把谁排在前面,ReverseComparator通过代理一个Comparator

private final Comparator<File> delegate;

构造时作为参数把delegate实例化,public ReverseComparator(Comparator<File> delegate),最后实现compare方法:

public int compare(File file1, File file2) {
       return delegate.compare(file2, file1); // parameters switched round
   }

完成整个反转排序的功能,看出端倪了吧。一个代理的引入,减少了一半的工作量,把排序功能实现的非常全面。

同理,组合排序器的实现正好利用了多维的代理

private final Comparator<File>[] delegates;

构造时传入的参数是一个可变长度数组,public CompositeFileComparator(Comparator<File>... delegates),或者一个可迭代对象,public CompositeFileComparator(Iterable<Comparator<File>> delegates),实现的compare方法如下:

public int compare(File file1, File file2) {
        int result = 0;
        for (Comparator<File> delegate : delegates) {
            result = delegate.compare(file1, file2);
            if (result != 0) {
                break;
            }
        }
        return result;
    }

组合排序就是提供一系列排序器,顺序比较,直到出现不相等情况。考虑到实际应用,我们经常是否只是实现了Comparable接口,在compareTo方法中写if else呢?引入代理的排序器api设计,给了我们不错的启示。

目录
相关文章
|
16天前
|
设计模式 Java API
Java 可扩展 API 设计:打造灵活的应用架构
【4月更文挑战第27天】设计可扩展的 API 是构建灵活、易于维护的应用程序架构的关键。Java 提供了丰富的工具和技术来实现这一目标,使开发者能够构建具有高度可扩展性的应用程序。
38 4
|
16天前
|
存储 缓存 安全
API在Visual Basic中的应用:连接外部服务与扩展功能
【4月更文挑战第27天】本文探讨了在Visual Basic中使用API连接外部服务和扩展功能的方法,涵盖了API的基本概念、种类及如何使用本地和Web API。通过DllImport调用本地API,利用HttpClient和WebClient与Web API交互,同时强调了第三方API的使用和SOA架构中的API角色。安全性、性能优化和错误处理是实践中的关键点。案例研究和最佳实践有助于开发者更有效地利用API,提升Visual Basic应用程序的功能和灵活性。随着API技术的发展,Visual Basic将持续支持开发者创造更强大的应用。
|
6天前
|
供应链 搜索推荐 API
API在电子商务中的应用与优势:深入解析
API是电子商务成功的关键,它们不仅促进了技术创新,还提高了用户体验和运营效率。随着技术的不断进步,API将继续在电子商务领域发挥更加重要的作用。电子商务平台通过利用API,可以更加灵活地适应市场变化,提供更加丰富和个性化的购物体验,最终实现业务的增长和扩展。
|
7天前
|
JSON API 数据格式
淘宝商品评论数据获取:从API调用到应用实践
在电商的世界里,用户评论是洞察商品质量的一扇窗。淘宝,作为中国最大的在线购物平台,其海量的商品评论数据尤为宝贵。本文将带您走进淘宝商品评论数据的获取之旅,从API调用的基础知识到实际应用的代码示例,一探究竟。
|
14天前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
15天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里函数计算中开启函数计算 API 接口如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
112 6
|
15天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使用阿里云API或SDK从函数计算调用ECS实例的服务如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
42 4
|
15天前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用之阿里函数计算中。将本地电脑上的项目文件部署到阿里云函数计算(FC)上并实现对外提供API和WebUI如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
33 1
|
15天前
|
运维 Serverless 5G
Serverless 应用引擎产品使用之调用阿里云函数计算API时获取有效的鉴权令牌如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
13 1
|
20天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
20 0