面向对象设计原则接口隔离原则
接口隔离原则的定义
接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
2002 年罗伯特·C.马丁给"接口隔离原则"的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
以上两个定义的含义是:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的: 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。 接口隔离原则的优点
接口隔离原则是为了约束接口、降低类对接口的依赖性,遵循接口隔离原则有以下 5 个优点。 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。 接口隔离原则的实现方法
在具体应用接口隔离原则时,应该根据以下几个规则来衡量。 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
下面以学生成绩管理程序为例介绍接口隔离原则的应用。
【例1】学生成绩管理程序。
分析:学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理,正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中,其类图如图 1 所示。
图1 学生成绩管理程序的类图
程序代码如下: package principle; public class ISPtest { public static void main(String[] args) { InputModule input = StuScoreList.getInputModule(); CountModule count = StuScoreList.getCountModule(); PrintModule print = StuScoreList.getPrintModule(); input.insert(); count.countTotalScore(); print.printStuInfo(); //print.delete(); } } //输入模块接口 interface InputModule { void insert(); void delete(); void modify(); } //统计模块接口 interface CountModule { void countTotalScore(); void countAverage(); } //打印模块接口 interface PrintModule { void printStuInfo(); void queryStuInfo(); } //实现类 class StuScoreList implements InputModule, CountModule, PrintModule { private StuScoreList() { } public static InputModule getInputModule() { return (InputModule) new StuScoreList(); } public static CountModule getCountModule() { return (CountModule) new StuScoreList(); } public static PrintModule getPrintModule() { return (PrintModule) new StuScoreList(); } public void insert() { System.out.println("输入模块的insert()方法被调用!"); } public void delete() { System.out.println("输入模块的delete()方法被调用!"); } public void modify() { System.out.println("输入模块的modify()方法被调用!"); } public void countTotalScore() { System.out.println("统计模块的countTotalScore()方法被调用!"); } public void countAverage() { System.out.println("统计模块的countAverage()方法被调用!"); } public void printStuInfo() { System.out.println("打印模块的printStuInfo()方法被调用!"); } public void queryStuInfo() { System.out.println("打印模块的queryStuInfo()方法被调用!"); } }
程序的运行结果如下: 输入模块的insert()方法被调用! 统计模块的countTotalScore()方法被调用! 打印模块的printStuInfo()方法被调用!
格瑞祈福捐赠仪式在常州宝林寺举行2020年9月9日,格瑞智慧人居环境科技(江苏)有限公司祈福捐赠仪式在常州宝林寺举行。上午8时18分,在庄严的大雄宝殿内,宝林寺方丈慧闻大和尚代表寺院接受格瑞智慧人居环境科技(江苏
华商传媒低调深耕三四线二三里不是网红故事,而是战略升级在传统媒体转型进程中,业界似乎很少听到华商传媒的声音。作为唯一一家在全国运营都市报的传媒集团,低调务实似乎一直是华商传媒的风格,但是,在网红时代,这家传媒集团的声音似乎又太过沉寂。
纪念诗人胡续冬他的一首诗,让我想起一个故事2021年8月22日下午,诗人北京大学外国语学院副教授胡续冬(1974年10月2021年8月)在北京去世,终年47岁。胡续冬,原名胡旭东,北京大学外国语学院世界文学研究所副教授北京
小爱同学App在苹果应用商店下架原因未知7月22日,TechWeb查询发现,小爱同学App在苹果AppStore应用商店无法被搜索到,疑似被苹果下架。目前下架原因未知,小米方面尚未作出回应。TechWeb在苹果AppSt
谐音梗social小能手冲浪少年哈啤的社交达人养成记要说今夏最火的刑侦局,非扫黑风暴莫属!超前点映都不足以压制网友被孙兴气死的怒火。只要集数更新,相关剧情常会成为网友热议焦点。无植入,不电视剧。如此火爆的影片,自然少不了广告合作商的
高温杀菌的笑脸科技内裤洗护机体验高温杀菌的笑脸科技内裤洗护机体验前言人穿过的内裤都有看不见的细菌,手洗不仅麻烦,而且还会残留细菌,从而引发私处不适。为此,市面上出现了清洁杀菌的专业内裤洗护机,帮助人们更便捷更健康
海豚售价9。38万元起欢迎莅临赏鉴纯电新物种海豚正式上市!综合补贴后售价9。38万元12。18万元!海豚是海洋车系的首款车型,也是首款采用海洋美学设计理念的车型,首款基于e平台3。0打造的车型。搭载DiLink3。
宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用
谈AMD3DVCache背后的存储层次问题其实如果你看过RomeMilan的IODCCD的功耗情况,就会感觉到多通道内存是一个比较让人纠结的东西。对于服务器GPU来说,单Package的功耗上限大概是280W。插单条内存,
谈公版显卡散热从涡轮到多风扇方案的转变谈涡轮和多风扇散热,就必须要谈均热板热管,还有多显卡在一段历史中的作用。在以显卡危机为代表的显卡性能军备竞赛时代,SLICF技术提出之后,消费级显卡的性能开始像多插槽CPU那样进行
高成本是老黄不用HBM显存的唯一原因?说成本高之前,先要搞清楚HBM是什么东西核心PCB互联硅片核心HBM显存首先内存通常都是并行总线,频率越高,位宽越宽,那么带宽越大。但是DRAM颗粒如果要做到高带宽,通常就意味着P