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

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

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

一个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设计,给了我们不错的启示。

时间: 2024-10-26 18:51:18

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

从涂鸦到发布——理解API的设计过程(转)

英文原文:From Doodles to Delivery: An API Design Process 要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础.但如果你的目标是创建出优秀的API,那么仅凭这一点还远远不够.设计优秀的API是一个艰难的过程,如果它恰巧是你当前的工作任务,那么你很可能会感到手足无措. 不过,优秀的设计绝对是可以实现的.本文所描述的流程将帮助你获得成功,我们将共同研究什么是优秀的设计,以及迭代式的流程如何帮助我们实现这一目标.我们还将叙

API的设计与实现

关于API的设计与实现 API的设计是软件开发中一个独特的领域.最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces.类似于用户可以直接使用到的GUI的作用一样.所以相对于依据软件设计的原则,考虑用户的"体验"会更加重要. 许多著名的工具和库的作者都写过相关的著作,详细的论述他们在API上的设计与实现要点.下面的论述,就是从这些前人的工作成果中总结而来.以下先列出参考资料: 1.软件框架设计的艺术 (Jaroslav Tul

做好扁平化设计-视觉篇

  1.去掉特效 先来看一组对比图片 同样是镜头的设计,在扁平化中去祛除了渐变,阴影,质感,等各种修饰手法,仅用简单的形体来表达,显的干净利落. 做减法,这第一步应该是最容易的. 2.简化提取 首先我们来看看做简化和提取的一个典型例子 毕加索画的牛 一头牛从最初的写实到最后仅仅只用几根线条来表示,整个简化的过程也经历了好几个步骤,当然这里对设计师观察和提炼能力要求很高,要充分了解对象物的本质,懂得巧妙的取舍,用极简的要素,在没有更多特效装饰的情况下表达清楚内容,在界线与轮廓的高对比下,表现出物体

揭秘ZSearch2.0—基于OpenResty的API网关设计

背景 OpenResty 是一个支持lua的nginx,并且内置了一些常用的lua库.利用lua,我们就可以便捷得扩展nginx能力,甚至可以直接作为Web服务对外提供. 主页链接 由下图可以看出,我们可以在各个阶段进行干预. 设计 本文介绍的API网关设计很简单,主要有路由,过滤器,拦截器三个部分组成. 可以实现权限验证,日志记录,参数改写,限流限速等功能. 实现关键 这套方案实现并不复杂,主要是对nginx的干预要可控,对nginx主要的干预点有三个. init_worker_by_lua_

接口-移动应用中 服务端API的设计

问题描述 移动应用中 服务端API的设计 php作为服务端 Android ,苹果 作为客户端,php 提供API接口的时候 应该怎么设计才能解决新旧版本 及 安卓 和 苹果版本不一致的问题,2. 怎么设计接口才能保证功能的可扩展性 和 灵活性 求教大家 能否给一个完整的例子 或者 说说思路也可以 解决方案 API中带一个版本信息http://www.xxx.com/api/v1.0http://www.xxx.com/api/v2.0 区分android和ios,可以在api中带一个os参数来

《JavaScript应用程序设计》一一2.9 方法API的设计

2.9 方法API的设计 JavaScript中的语言特性可以帮助你更好地设计方法API,包括参数命名.函数多态.链式调用.lambda等.你应该了解并掌握这些语言特性,以便在合适的时候将它们引入.当你在设计方法API时,要时刻牢记章首介绍的四项原则,这里再强调一遍:· 保持简单· 一次只做一件事情· 不要重复造轮子· 少即是多

微信小程序的Web API接口设计及常见接口实现

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们设计和编写Web API平台是非常重要的,通过这个我们可以实现数据的集中控制和管理,本篇随笔介绍基于Asp.NET MVC的Web API接口层的设计和常见接口代码的展示,以便展示我们常规Web API接口层的接口代码设计.参数的处理等内容. 1.Web API整体性的架构设计 我们整体性的架构设计

Web API接口设计经验总结

在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winform混合框架中的应用(2)--自定义异常结果的处理>也进行了总的介绍,在经过我的大量模块实践并成功运行后,总结了这篇随笔,希望对大家有所帮助. 1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时

Google 推出开源设计平台 Material.io

设计是一门不断发现问题并解决问题的艺术:发现需求,形成想法,然后打造合适的解决方案,周而复始.现在,这一极富创意和挑战的工作,有了一个新的平台.Google 推出开源设计平台 Material.io,为设计师提供丰富的资源.工具和灵感. 此次开源设计平台 Material.io 提供了全新的工具和灵感,为优秀设计团队提升沟通和生产力. Material.io 将 Material Design 的现有资源进行了集中,并为其打造了全新的视觉识别系统.在这个站点上,从工具到组件都实现了更好的交互,同