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

问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

举例来说明接口隔离原则:

(图1 未遵循接口隔离原则的设计)

这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。对类图不熟悉的可以参照程序代码来理解,代码如下:

interface I {  public void method1();  public void method2();  public void method3();  public void method4();  public void method5();  }  class A{  public void depend1(I i){  i.method1();  }  public void depend2(I i){  i.method2();  }  public void depend3(I i){  i.method3();  }  }  class B implements I{  public void method1() {  System.out.println("类B实现接口I的方法1");  }  public void method2() {  System.out.println("类B实现接口I的方法2");  }  public void method3() {  System.out.println("类B实现接口I的方法3");  }  //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法,  //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。  public void method4() {}  public void method5() {}  }  class C{  public void depend1(I i){  i.method1();  }  public void depend2(I i){  i.method4();  }  public void depend3(I i){  i.method5();  }  }  class D implements I{  public void method1() {  System.out.println("类D实现接口I的方法1");  }  //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个方法,  //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。  public void method2() {}  public void method3() {}  public void method4() {  System.out.println("类D实现接口I的方法4");  }  public void method5() {  System.out.println("类D实现接口I的方法5");  }  }  public class Client{  public static void main(String[] args){  A a = new A();  a.depend1(new B());  a.depend2(new B());  a.depend3(new B());  C c = new C();  c.depend1(new D());  c.depend2(new D());  c.depend3(new D());  }  }复制代码

可以看到,如果接口过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法,这显然不是好的设计。如果将这个设计修改为符合接口隔离原则,就必须对接口I进行拆分。

在这里我们将原有的接口I拆分为三个接口,拆分后的设计如图2所示:

(图2 遵循接口隔离原则的设计)

照例贴出程序的代码,供不熟悉类图的朋友参考:

interface I1 {  public void method1();  }  interface I2 {  public void method2();  public void method3();  }  interface I3 {  public void method4();  public void method5();  }  class A{  public void depend1(I1 i){  i.method1();  }  public void depend2(I2 i){  i.method2();  }  public void depend3(I2 i){  i.method3();  }  }  class B implements I1, I2{  public void method1() {  System.out.println("类B实现接口I1的方法1");  }  public void method2() {  System.out.println("类B实现接口I2的方法2");  }  public void method3() {  System.out.println("类B实现接口I2的方法3");  }  }  class C{  public void depend1(I1 i){  i.method1();  }  public void depend2(I3 i){  i.method4();  }  public void depend3(I3 i){  i.method5();  }  }  class D implements I1, I3{  public void method1() {  System.out.println("类D实现接口I1的方法1");  }  public void method4() {  System.out.println("类D实现接口I3的方法4");  }  public void method5() {  System.out.println("类D实现接口I3的方法5");  }  }复制代码

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

本文例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。

采用接口隔离原则对接口进行约束时,要注意以下几点:

1、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

2、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

3、提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

4、运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。

原文:http://blog.csdn.net/zhengzhb/article/details/7296921

设计模式初探之设计模式六大原则(4):接口隔离原则相关推荐

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

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

  2. 六大设计原则之接口隔离原则

    接口隔离原则定义 接口隔离有两种定义: Clients should not be forced to depend upon interfaces that they don't use. 客户端不 ...

  3. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...

  4. 单一职责原则和接口隔离原则区别的理解

    网上对于两者的区别众说纷纭,总是一套理论下来跟没有说一样,下面说说自己的理解:  单一职责原则: 是将某一职责的方法全放在一个接口中,这时候就会出现实现该接口的类必须实现该接口中自己用不到的方法(违背 ...

  5. 软件设计原则之接口隔离原则、合成复用原则、迪米特原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...

  6. 面向对象编程原则(07)——接口隔离原则

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...

  7. 七大设计原则之接口隔离原则应用

    目录 1 接口隔离原则介绍 2 接口隔离原则应用 1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接 ...

  8. 软件设计模式六大原则之四接口隔离原则(PHP语言实现)

    转载,原文链接https://www.cnblogs.com/zhanghengscnc/p/8299459.html 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口 ...

  9. 深入浅出设计模式原则之接口隔离原则(ISP)

    下面以学生成绩管理程序为例介绍接口隔离原则的应用(工程源码). 分析:学生成绩管理程序一般包含插入成绩.删除成绩.修改成绩.计算总分.计算均分.打印成绩信息.査询成绩信息等功能,如果将这些功能全部放到 ...

  10. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

最新文章

  1. r-route 命令 显示/配置ip路由表
  2. python里的类与一切事物都是对象
  3. python工程师一个月多少钱-苏州工业园区学编程大概多少钱一个月
  4. POJ3080方法很多(暴力,KMP,后缀数组,DP)
  5. 关于文件操作的\r\n问题。
  6. thinkphp的快捷方法实例化对象
  7. 【探索篇】测试人员一直疏忽掉的测试用例点,你中枪了吗?
  8. 用 Crontab 进行简单的备份日志任务计划
  9. 这枚纸币为什么这么贵?
  10. 编码规范(代码优化)
  11. 如何成为一个成功的 Java 开发人员?
  12. Apache SOLR and Carrot2集成
  13. java 空文件夹删除_java创建文件文件夹,删除空文件夹,删除文件夹以及所有文件...
  14. 百度文库免财富值下载文件
  15. IGS Viewer / IGS 文件查看器
  16. smartdns 部署最佳实践
  17. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener解决方案
  18. mysql数据库常用存储引擎的区别
  19. arduino编程语言Wiring参考手册API
  20. pg服务管理 与 psql常用命令

热门文章

  1. DataGrid/DataList在ASP.NET中应用
  2. C++std::vector指定位置插入
  3. 机器人学习--Imperial College London机器人学课程
  4. Java实现excel的读与写(Apache POI)
  5. rhino6.0安装教程
  6. Debug下正常,而Release失败的真正原因
  7. java applet退出功能_java-如何使用内置在applet中的Button在浏览器中停止applet?
  8. 三星s8清除html查看器,三星S8手机怎么双清 清理手机数据方法介绍 - Iefans
  9. 剑指offer全套题解:Python版
  10. 我的世界minecraft-Python3.9编程(1)-开发环境配置(1)