介绍

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上

Demo引入

先来看一张图:

interface MyInterface {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
} class B implements MyInterface { @Override
public void operation1() {
System.out.println("B实现了operation1");
} @Override
public void operation2() {
System.out.println("B实现了operation2");
} @Override
public void operation3() {
System.out.println("B实现了operation3");
} @Override
public void operation4() {
System.out.println("B实现了operation4");
} @Override
public void operation5() {
System.out.println("B实现了operation5");
}
} class D implements MyInterface { @Override
public void operation1() {
System.out.println("D实现了operation1");
} @Override
public void operation2() {
System.out.println("D实现了operation2");
} @Override
public void operation3() {
System.out.println("D实现了operation3");
} @Override
public void operation4() {
System.out.println("D实现了operation4");
} @Override
public void operation5() {
System.out.println("D实现了operation5");
}
} class A {
//类A通过接口MyInterface依赖(使用)B类, 但是只使用1,2,3方法
public void depand1(MyInterface myInterface) {
myInterface.operation1();
} public void depand2(MyInterface myInterface) {
myInterface.operation2();
} public void depand3(MyInterface myInterface) {
myInterface.operation3();
}
} class C {
public void depand1(MyInterface myInterface) {
myInterface.operation1();
} public void depand4(MyInterface myInterface) {
myInterface.operation4();
} public void depand5(MyInterface myInterface) {
myInterface.operation5();
}
}

如上图所示:类A通过接口MyInterface依赖类B,类C通过接口MyInterface依赖类D;但是,类A只是想要使用B实现的接口MyInterface中的1,2,3方法,类C想要使用类D实现的接口MyInterface中的1,4,5方法;所以,现在的设计,从接口隔离原则的角度来说,不符合“最小接口”。

改进措施:

既然接口MyInterface中的方法对于实现类来说,不是全部都需要的,那么,我们根据需求,将原来的接口进行拆分:

如图所示: 将原来的一个接口拆分为三个,对应的code如下:

interface MyInterface1 {
void operation1(); } interface MyInterface2 {
void operation2();
void operation3(); } interface MyInterface3 {
void operation4();
void operation5();
} class B implements MyInterface1, MyInterface2 { @Override
public void operation1() {
System.out.println("B实现了operation1");
} @Override
public void operation2() {
System.out.println("B实现了operation2");
} @Override
public void operation3() {
System.out.println("B实现了operation3");
} } class D implements MyInterface1, MyInterface3 { @Override
public void operation1() {
System.out.println("D实现了operation1");
} @Override
public void operation4() {
System.out.println("D实现了operation4");
} @Override
public void operation5() {
System.out.println("D实现了operation5");
}
} class A {
//类A通过接口MyInterface依赖(使用)B类, 但是只使用1,2,3方法
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
} public void depand2(MyInterface2 myInterface) {
myInterface.operation2();
} public void depand3(MyInterface2 myInterface) {
myInterface.operation3();
}
} class C {
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
} public void depand4(MyInterface3 myInterface) {
myInterface.operation4();
} public void depand5(MyInterface3 myInterface) {
myInterface.operation5();
}
}

总结

接口的设计尽量要小

这是接口隔离的核心,当然过小的接口会导致项目结构的负责度增加,在实际使用中,要合理把握尺度。

接口要高内聚

即接口尽量少的公布public方法,在项目开发中,接口通常充当规范来使用,是一种承诺,承诺越少越有利于系统开发。

DesignPattern系列__02接口隔离原则的更多相关文章

  1. 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...

  2. C#软件设计——小话设计模式原则之:接口隔离原则ISP

    前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...

  3. 设计原则:接口隔离原则(ISP)

    接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...

  4. 设计模式之接口隔离原则(ISP)

    一.定义: ISP:Interface Segregation Principle 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接 ...

  5. 设计模式之六大原则——接口隔离原则(ISP)

    设计模式之六大原则——接口隔离原则(ISP)  转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...

  6. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

    第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...

  7. 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)

    4. 接口隔离原则(Interface Segregation Principle,ISP) 4.1 定义 (1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口.类间的 ...

  8. 4.接口隔离原则(Interface Segregation Principle)

    1.定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 2.定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应 ...

  9. 【设计模式六大原则4】接口隔离原则(Interface Segregation Principle)

      定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类 ...

随机推荐

  1. 4.shell编程-文本处理三剑客之sed

    4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...

  2. Git及基础命令的介绍以及如何向本地仓库添加文件

    在介绍Git的使用之前,我们得要先来了解一下Git.那么什么是Git? Git是一个版本管理工具(VCS),具有以下的特点: 分布式版本控制: 多个开发人员协调工作: 有效监听谁做的修改: 本地及远程 ...

  3. GRPC Oauth Identity

    gRPC中集成asp.net identity实现oAuth认证 在asp.net core 3.0中开启identity认证 asp.net core 3.0种需要导入的identity包与core ...

  4. 美化Div的边框

    CSS修饰Div边框 大部分时候,Div的边框真的做的太丑了,如果不用很多样式来修饰的话,它永远都是那么的突兀.作为一个后端开发,前端菜鸡,在没有设计和前端开发自己独自做项目的时候常常会遇到Div边框 ...

  5. 5分钟快速部署DataDraw数字绘

    经常有小伙伴问,有没有一款好用又免费的画图软件,画画流程图.UML.思维导图?今天就介绍一款开源的在线画图软件,满足各方面人的需求. DataDraw数字绘是一个在线线框图.流程图.网络图.组织结构图 ...

  6. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  7. TPL DataFlow .Net 数据流组件,了解一下

    回顾上文 作为单体程序,依赖的第三方服务虽不多,但是2C的程序还是有不少内容可讲: 作为一个常规互联网系统,无外乎就是接受请求.处理请求,输出响应. 由于业务渐渐增长,数据处理的过程会越来越复杂和冗长 ...

  8. WeUI Picker组件 源代码分析

    前言 由于最近做的一个移动端项目需要使用到类似 WeUI Picker组件 的选择效果,  所以在这里来分析下 WeUI Picker 的实现逻辑.(weui.js项目地址) 之前也做过类似的组件, ...

  9. Acrobat pro Dc 2018破解版|Adobe Acrobat pro Dc 2018中文破解版下载(附序列号/免破解)

    Acrobat pro Dc 2018破解版是由Adobe公司开发的一款PDF编辑软件,它可以以PDF格式制作和保存用户的文档,以此方便浏览和打印,或使用更高级的功能,且PDF格式的文档可如实地保留原 ...

  10. 彻底透析SpringBoot jar可执行原理

    ​ 文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看.同时文章是基于SpringBoot-2.1.3进行分析.涉及的知识点主要包括Maven的生命周期以及自定 ...