一、定义

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

通俗的来说就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿不堪。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加轻便灵活。

注意点:

大家不要把接口隔离原则和单一职责原则相弄混。接口隔离原则和单一职责原则的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分,而接口隔离原则要求方法要尽可能的少,是在接口设计上的考虑。

二、案例解析

还是用我们之前说过的娱乐圈举例吧,假设现在有星探1和星探2要找美女明星。他们的评判标准不太一样,星探1觉得:身材好、面容姣好就是美女,星探2觉得气质好的女生就是美女。

下面我们开始写代码

我们定义美女接口,代码如下:

//美女接口
public interface IPettyGirl {//要有姣好的面孔public void goodLooking();//要有好身材public void niceFigure();//要有气质public void greatTemperament();
}//接口的实现类
public class PettyGirl implements IPettyGirl {private String name;public PettyGirl(String  name){  this.name= name;}//脸蛋漂亮
public void goodLooking() {System.out.println(this.name + "---脸蛋很漂亮!");
}//气质要好
public void greatTemperament() {System.out.println(this.name + "---气质非常好!");
}//身材要好
public void niceFigure() {System.out.println(this.name + "---身材非常棒!");}
}

下面我们写出两个星探代码。

//星探的抽象
public abstract class AbstractSearcher {protected IPettyGirl pettyGirl;public AbstractSearcher(IPettyGirl pettyGirl){this.pettyGirl = pettyGirl;}//搜索美女, 列出美女信息public abstract void show();
}//星探1实现类,他以为身材好、面容姣好就是美女
public class Searcher1 extends AbstractSearcher{public Searcher(IPettyGirl pettyGirl){super(pettyGirl);}//展示美女的信息public void show(){System.out.println("--------美女的信息如下:---------------");//展示面容super.pettyGirl.goodLooking();//展示身材super.pettyGirl.niceFigure();}
}//星探1实现类,他以为气质好就是美女
public class Searcher2 extends AbstractSearcher{public Searcher(IPettyGirl pettyGirl){super(pettyGirl);}//展示美女的信息public void show(){System.out.println("--------美女的信息如下:---------------");//展示气质super.pettyGirl.greatTemperament();}
}//下面是客户端代码
public class Client {//搜索并展示美女信息public static void main(String[] args) {//定义一个美女IPettyGirl xiaoMei = new PettyGirl("小美");AbstractSearcher searcher1 = new Searcher1(yanYan);searcher1.show();AbstractSearcher searcher2 = new Searcher2yanYan);searcher2.show();}
}

写完后,感觉还不错,但是这么设计不是最优代码。IPrettyGirl接口中包含了太多的功能,按照这个接口设计,所有的女人都要实现这三个方法,那所有女人岂不是都是美女?而且Searcher1和Search2二个类也仅仅使用了接口中的部分功能,这就违背了接口隔离原则。下面我们对这个接口拆分一下,代码如下:

public interface IGoodBodyGirl {//要有姣好的面孔public void goodLooking();//要有好身材public void niceFigure();
}public interface IGreatTemperamentGirl {//要有气质public void greatTemperament();
}
//女孩1:身材,面容,气质都很好
public class PettyGirl1 implements IGoodBodyGirl,IGreatTemperamentGirl {...中间实现方法略...
}//女孩2:身材,面容很好
public class PettyGirl2 implements IGoodBodyGirl {...中间实现方法略...
}

这样设计是不是就灵活多了呢?经过重新设计,程序变得更加灵活,这就是接口隔离原则的强大之处。

PS:注意接口隔离原则的辩证关系

接口设计的粒度越小,系统越灵活,这是不争的事实,但是灵活的同时也带来了结构的复杂化,开发难度的增加,可维护性降低。所以这个度要进行权衡。

好了,就先分享到这里,关注我,java学习不头秃,还为每位粉丝准备了一份全面的资料福利,从面试简历模板大厂面经汇总,大厂内部技术资料互联网高薪必读书单,以及Java面试核心知识点(283页)和Java面试题合集2022年最新版(485页)等等,有需要的可以点下方名片领取

设计模式7大原则——接口隔离原则解析(含代码示例)相关推荐

  1. 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )

    文章目录 一.接口隔离原则简介 二.接口隔离原则代码示例 ( 反面示例 ) 1.接口定义 ( 接口臃肿 ) 2.实现类 1 3.实现类 2 三.接口隔离原则代码示例 ( 推荐用法 ) 1.接口 1 2 ...

  2. 设计模式系列(二)七大设计原则-----接口隔离原则

    七大设计原则之单一接口隔离原则 接口隔离原则 案例 应用实例 改进 上一篇:设计模式系列(一)七大设计原则-----单一职责原则 下一篇:设计模式系列(三)七大设计原则-----依赖倒转原则 接口隔离 ...

  3. 六大设计原则-接口隔离原则

    1.开闭原则        2.接口隔离原则 3.依赖倒置原则 4.迪米特原则             5.里氏替换原则     6.单一职责原则 接口隔离原则 客户端不应该依赖它不需要的接口:一个类 ...

  4. [设计模式]设计模式之禅关于接口隔离原则

    在讲接口隔离原则之前,先明确一下我们的主角--接口.接口分为两种: ● 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生一个实例,它是对一个类型的事物的描述 ...

  5. 设计模式之禅之接口隔离原则

    声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 接口隔离原则(Interface Segregation Principle):每个模块接口独立 1.定 ...

  6. 学习设计模式 - 六大基本原则之接口隔离原则

    设计模式总共有六大基本原则,统称为SOLID (稳定)原则,分别是S-单一职责原则(Single Responsibility Principle), O-开闭原则(Open closed Princ ...

  7. 六大设计模式原则-接口隔离原则

    一.接口隔离原则定义 接口隔离原则定义如下: 接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些 ...

  8. java设计模式之设计原则④接口隔离原则

    定义: (1)用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口. (2)一个类对一个类的依赖应该建立在最小的接口上. (3)建立单一接口,不要建立庞大臃肿的接口. (4)尽量细化 ...

  9. 设计模式原则 - 接口隔离原则(二)

    接口隔离原则 一 官方定义 二 案例演示 普通方案 案例分析 解决方案 解决方案 案例总结 三 与单一职责原则对比 一 官方定义 接口隔离原则(Interface Segregation Princi ...

最新文章

  1. Non-ASCII character '\xe6'
  2. 半监督训练-思想与代码实践
  3. 第三次学JAVA再学不好就吃翔(part67)--Math类
  4. 安装JDK-- Java基础
  5. Java 中的目录创建处理
  6. 关于Docker官方CentOS镜像无法启动mysqld的总结
  7. python调用java文件_Python程序中调用Java代码的实践
  8. zabbix的trigger
  9. java web filter 入口_springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径
  10. 在一个环境中使用不同版本的rails
  11. pg 简单备份和恢复
  12. 下载站mime属性设置(让文件可下载)
  13. 什么是JavaSE,写给第一次接触Java的人
  14. 卷积神经网络原理与实现过程
  15. 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机
  16. 教你用前端制作fashion充电水滴融合特效
  17. 怎么去搭建聚合支付系统比较划算
  18. 工程伦理--4.2 划界法
  19. 深度学习中,偏置(bias)在什么情况可以不要?
  20. flickr的奇怪的认证过程

热门文章

  1. Kotlin 全部基础
  2. LeetCode刷题前必须要知道的时间复杂度
  3. T-SQL中的注释符和运算符
  4. 天啊,绕过我吧,不要卷了
  5. KDZD608 型屏蔽服效率试验装置
  6. ffprobe-命令行详解
  7. promise微任务的执行
  8. webstorm中没有vue插件_webstorm安装vue插件及安装过程出现的问题
  9. WTO世界贸易报告:2003-2021年
  10. python中的divmod