什么是接口隔离原则?

接口隔离原则有两种定义:

Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该强行依赖它不需要的接口)

The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上)

这两个定义可以归纳为一个意思: 建立单一接口,不要建立臃肿庞大的接口。也就是说, 接口尽量细化,同时接口中的方法尽量少

接口隔离原则看起来似乎和单一职责原则撞一块了,但是:

  • 单一职责原则要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分。
  • 接口隔离原则要 求接口的方法尽量少,哪怕一个类或接口只有一个职责,但却有较多的方法,这再接口隔离原则中是不允许的。

为什么要用接口隔离原则?

以星探寻找美女为例:

不遵循接口隔离原则的设计

4-1:星探寻找美女类图

美女接口:

美女接口作了美女的定义。

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(); }

星探实现类:

public class Searcher extends AbstractSearcher{ public Searcher(IPettyGirl _pettyGirl){ super(_pettyGirl); }//展示美女的信息 public void show(){ System.out.println("--------美女的信息如下:---------------"); //展示面容 super.pettyGirl.goodLooking(); //展示身材 super.pettyGirl.niceFigure(); //展示气质 super.pettyGirl.greatTemperament(); } }

场景类:

public class Client { //搜索并展示美女信息 public static void main(String[] args) { //定义一个美女 IPettyGirl yanYan = new PettyGirl("嫣嫣"); AbstractSearcher searcher = new Searcher(yanYan);   searcher.show(); }
}

运行结果:

--------美女的信息如下:---------------
嫣嫣---脸蛋很漂亮!
嫣嫣---身材非常棒!
嫣嫣---气质非常好!

OK,这么一个选美的过程完成了。

但是仔细一想,这个接口的设计还是有问题的。这里选出的美女要容貌、身材、气质都很好。但是,如果容貌、气质都很好,身材稍逊就不算美女了吗?不然的话,怎么会有热辣型美女、气质型美女呢?IPettyGirl的设计明显是有缺陷的,过于庞大了,容纳了一些可变的因素。

遵循接口隔离原则的设计

根据接口隔离原则,重新设计。

将IPettyGirl接口拆分为两个接口,外观型美女IGoodBodyGirl,脸蛋和身材极棒;气质型美女IGreatTemperamentGirl,谈吐和修养都非常高。

4-2:修改后的星探寻找美女类图

两种类型的美女定义接口:

public interface IGoodBodyGirl { //要有姣好的面孔 public void goodLooking(); //要有好身材 public void niceFigure();
}public interface IGreatTemperamentGirl { //要有气质 public void greatTemperament(); }

完美的美女接口:

public class PettyGirl implements IGoodBodyGirl,IGreatTemperamentGirl { 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 + "---身材非常棒!"); } }

把一个臃肿的接口变更为两个独立的接口所依赖的原则就是接口隔离原则,让星探 AbstractSearcher依赖两个专用的接口比依赖一个综合的接口要灵活。接口是设计时对外 提供的契约,通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性。

深究接口隔离原则

接口隔离原则是对接口进行规范约束,其包含以下4层含义:

  • 接口要尽量小

这是接口隔离原则的核心定义,不出现臃肿的接口(Fat Interface)。

但是,小是有限度的,根据接口隔离原则拆分接口时,首先必须满足单一职责原则。

  • 接口要高内聚

高内聚就是提高接口、类、模块的处理能力,减少对外的交互。

具体到接口隔离原则就是,要求在接口中尽量 少公布public方法,接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险也就越 少,同时也有利于降低成本。

  • 定制服务

一个系统或系统内的模块之间必然会有耦合,有耦合就要有相互访问的接口(并不一定 就是Java中定义的Interface,也可能是一个类或单纯的数据交换),设计时就需要为各个访问者(即客户端)定制服务。

  • 接口设计是有限度的

接口的设计粒度越小,系统越灵活,这是不争的事实。但是,灵活的同时也带来了结构 的复杂化,开发难度增加,可维护性降低,这不是一个项目或产品所期望看到的,所以接口 设计一定要注意适度,这个“度”如何来判断呢?根据经验和常识判断,没有一个固化或可测 量的标准。


⇐⇐ 设计模式—— 三:依赖倒置原则
设计模式—— 五:迪米特原则 ⇒⇒

参考:

【1】:《设计模式之禅》
【2】:设计模式六大原则(4):接口隔离原则
【3】:聊聊设计模式原则(二) – 接口隔离原则

设计模式—— 四:接口隔离原则相关推荐

  1. 深入浅出设计模式_深入浅出设计模式03接口隔离原则

    本文作者:开课吧寂然 图文编辑:开三金 大家好~,我是寂然~,本节课呢,我来给大家介绍设计模式原则之接口隔离原则. 话不多说,我们直接进入正题,老规矩,首先带大家了解一下接口隔离原则的官方定义,并作一 ...

  2. 设计模式:接口隔离原则

    定义 接口隔离原则(Interface Segregation Principle, ISP),定义为: Clients should not be forced to depend upon int ...

  3. 围观设计模式(4)--接口隔离原则(ISP,Interface Segregation Principle)

    接口隔离原则(英语:interface-segregation principles, 缩写:ISP)指明没有客户(client)应该被迫依赖于它不使用方法.接口隔离原则(ISP)拆分非常庞大臃肿的接 ...

  4. 【设计模式】接口隔离原则

    接口隔离原则 原则概述:客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上 如图中,[对象B]依赖[类D],[对象C]依赖[类E],但[类D]和[类E]都依赖于[接口A]. ...

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

    接口隔离原则定义: 一个类对另一个类的依赖应该建立在最小的接口上,使得接口中的方法得到充分利用. uml图: 相关代码1: /*接口没有得到充分的利用,所以他违反了接口隔离原则. */public c ...

  6. 嘻哈说:设计模式之接口隔离原则

    1.定义 按照惯例,首先我们来看一下接口隔离原则的定义. 类间的依赖关系应该建立在最小的接口上. 接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法. 有点类似于单一职责原则,都是 ...

  7. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  8. 【专题系列】设计模式—— 四:接口隔离原则

    点击上方"java大数据修炼之道",选择"设为星标" 优质文章, 第一时间送达 来源 | https://www.cnblogs.com/three-fight ...

  9. 接口隔离原则_设计模式之七大设计原则(上)

    这是雷总20多年前写的汇编程序,像诗一样优雅 而中国诗词讲究平仄.押韵.对仗等一系列的规则原则, 那么想要写出像诗一样优雅的程序你不得不知的 -- 设计模式之七大原则: 1.开闭原则:对修改关闭,对扩 ...

最新文章

  1. python中chr函数的用法_python中hex,oct,chr,ord函数讲解
  2. 为什么虚拟机的linux系统IP是10.0.2.15
  3. P2567 [SCOI2010]幸运数字
  4. 分布式事务之基础理论(CAP/BASE理论)篇
  5. SPACEMACS 配置
  6. Adobe Premiere(Pr视频剪辑)下载安装
  7. iOS推送之远程推送
  8. Create an undirected graph from the adjacency list
  9. 如何将鼠标和键盘连接到PlayStation 4
  10. 3D建模和渲染吃CPU还是显卡?专业显卡和游戏显卡的区别
  11. 网易区块链打造可信数字身份认证应用新场景,赋能科技峰会
  12. android存储pdf文件怎么打开,android打开pdf文件
  13. java小基础之代码块的霸道
  14. 机器学习scikit-learn(一)(转)
  15. 企业的代码发布解决方案
  16. 金蝶 EAS BOS F7监听器
  17. 使用晨曦记账本坚持记账,养成好习惯
  18. iOS UI入门——使用Objective-C和Swift简单实现UITableView
  19. 转:做一个有趣的有意思的人
  20. CentOS7.9下nginx的安装与配置(实现任意目录下均可直接执行 nginx 命令,以及开机自启动)

热门文章

  1. 神奇的口袋--刚好装满背包的方法总数
  2. 【IELTS】机考全流程
  3. IGBT体二极管参数
  4. 一个可以免费下载O Reilly的书籍的地方
  5. linux文件前面多两个点,Linux 学习笔记
  6. linux中nginx启动,重启,关闭命令
  7. linux之pmap命令查看进程的地址空间和占用的内存
  8. 多尺度动态图卷积神经网络----Multi-scale Dynamic Graph Convolutional Network for Hyperspectral Image Classificati
  9. ServerSocket和Socket连接
  10. wifi吞吐量测试环境搭建和mifi的wifi吞吐量测试