接口隔离原则

  • 一 官方定义
  • 二 案例演示
    • 普通方案
      • 案例分析
    • 解决方案
      • 解决方案
    • 案例总结
  • 三 与单一职责原则对比

一 官方定义

接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为:

  1. Clients should not be forced to depend upon interfaces that they don’t use.
    (客户端不应该依赖它不需要的接口)
  2. The dependency of one class to another one should depend on the smallest possible
    interface. (类间的依赖关系应该建立在最小的接口上)

基本介绍
通俗的来讲,不要在一个接口里面定义过多的方法,接口应该尽量细化

二 案例演示

假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆, 两个类张厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要李师傅来切番茄和切土豆

普通方案

public class SegregationDemo {public static void main(String[] args) {//水果店类new FruitShop().cutApple(new CookZhang());new FruitShop().cutTomato(new CookZhang());//蔬菜店类new VegetableShop().cutTomato(new CookLi());new VegetableShop().cutPotato(new CookLi());}
}
// 定义接口knife
interface Knife {//切苹果的能力void cutApple();//切番茄的能力void cutTomato();//切土豆的能力void cutPotato();
}//张厨师类
class CookZhang implements Knife {@Overridepublic void cutApple() {System.out.println("张厨师正在切苹果");}@Overridepublic void cutTomato() {System.out.println("张厨师正在切番茄");}@Overridepublic void cutPotato() {System.out.println("张厨师正在切土豆");}
}
//李厨师类
class CookLi implements Knife {@Overridepublic void cutApple() {System.out.println("李厨师正在切苹果");}@Overridepublic void cutTomato() {System.out.println("李厨师正在切番茄");}@Overridepublic void cutPotato() {System.out.println("李厨师正在切土豆");}
}/*假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆,两个类张
厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要
李师傅来切番茄和切土豆*///水果店类
class FruitShop {// 将接口类型作为参数传入public void cutApple(Knife knife) {knife.cutApple();}public void cutTomato(Knife knife) {knife.cutTomato();}
}//蔬菜店类
class VegetableShop {public void cutTomato(Knife knife) {knife.cutTomato();}public void cutPotato(Knife knife) {knife.cutPotato();}
}

案例分析


1、VegetableShop使用到Knife中两个方法,同样FruitShop也是如此
2、CookZhang,CookLi分别实现Knife这个接口Knifes对于CookZhang,CookLi不是最小的接口,
换句话说CookZhang,CookLi就必须实现他们不需要的方法。导致这个类出现了耦合
这就违反了接口隔离原则(类间的依赖关系应该建立在最小的接口上)

解决方案

解决方案

根据接口隔离原则,我们将Knife拆分为三个独立的接口不就行了吗!
步骤:

  1. 将Knife拆分为AppleKnife,TomatoKinfe,PotatoKnife三个独立的接口
  2. CookZhang(张厨师类 )实现AppleKnife,TomatoKinfe
  3. CookLi(李厨师类)实现TomatoKinfe,PotatoKnife
  4. FruitShop(水果店类)cutApple方法和cutTomato方法分别传入AppleKnife和TomatoKinfe
  5. VegetableShop(蔬菜店类)cutTomato方法和cutPotato方法分别传入TomatoKinfe和PotatoKnife

public class SegregationDemo {public static void main(String[] args) {//水果店类new FruitShop().cutApple(new CookZhang());new FruitShop().cutTomato(new CookZhang());//蔬菜店类new VegetableShop().cutTomato(new CookLi());new VegetableShop().cutPotato(new CookLi());}
}//示例接口隔离原则
// 将接口knife拆分为三个独立的接口
interface AppleKnife {//切苹果的能力void cutApple();}
interface TomatoKinfe{//切番茄的能力void cutTomato();
}
interface PotatoKnife{//切土豆的能力void cutPotato();
}//张厨师类
class CookZhang implements AppleKnife,TomatoKinfe {@Overridepublic void cutApple() {System.out.println("张厨师正在切苹果");}@Overridepublic void cutTomato() {System.out.println("张厨师正在切番茄");}}//李厨师类
class CookLi implements TomatoKinfe,PotatoKnife {@Overridepublic void cutTomato() {System.out.println("李厨师正在切番茄");}@Overridepublic void cutPotato() {System.out.println("李厨师正在切土豆");}
}/*假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆,
两个类张厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要
李师傅来切番茄和切土豆*/
//水果店类
class FruitShop {// 将接口类型作为参数传入public void cutApple(AppleKnife knife) {knife.cutApple();}public void cutTomato(TomatoKinfe knife) {knife.cutTomato();}
}//蔬菜店类
class VegetableShop {public void cutTomato(TomatoKinfe knife) {knife.cutTomato();}public void cutPotato(PotatoKnife knife) {knife.cutPotato();}
}

案例总结

接口隔离原则就是当我一个类通过接口依赖(使用)另一个类的时候,要保证依赖的该接口是最小的,
接口里面有方法用不到的,就进行隔离,而隔离的做法就是,就对原来接口进行拆分,拆分为最小粒度,来避免耦合

三 与单一职责原则对比

单一职责原则:合理的职责分解,一个类只负责一项职责
接口隔离原则:类间的依赖关系应该建立在最小的接口上

相同点
都要求对结构进行拆分,都要求更小的粒度,都希望减少耦合

不同点
审视角度的不同

单一职责原则:类与接口职责单一,注重的是职责
接口隔离原则:要求我们尽量使用多个专门的接口,注重的是接口的设计

我们使用接口隔离原则进行接口拆分的时候,要遵循单一职责原则

设计模式原则 - 接口隔离原则(二)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

    一.定义 客户端不应该依赖它不需要的接口,即 一个类对另一个类的依赖应该建立在最小的接口 上 . 通俗的来说就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿不堪.接口应该尽量细化,一个接口 ...

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

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

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

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

最新文章

  1. Nacos下载与安装-windows
  2. mac终端下修改MySQL的编码格式以解决中文乱码问题--找不到my-default.cnf及my.cnf
  3. LeetCode:汇总区间【228】
  4. Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
  5. 【转】:andriod 开发环境工具下载地址(2)
  6. easyexcel导出百万级数据_百万级别数据Excel导出优化
  7. 黑马程序员___Java基础[04-继承和多态]
  8. 测试TF card 的读写速度
  9. Javascript闭包 ,JS中没有public,private等修饰词,里面的变量就分为globle和局部变量
  10. python编程考试题目大全
  11. 通用办公报表打印软件
  12. 数学建模模型2——多属性决策模型之加权算术平均算子【评价型】
  13. JavaScript和JQuery好书推荐
  14. win7系统下如何在虚拟机中安装Linux系统
  15. qq登录 适用于 laravel
  16. 应用跳转(打电话/短信/邮件/浏览器/其他应用)
  17. 《Visual C++ 2010入门教程》 旗舰级详尽教程
  18. 《乘风破浪的姐姐2》开播大热,姐姐们的.fans相关域名速来抢!
  19. 史上程序员被黑得最惨的一次?
  20. 自定义标签(TagSupport )

热门文章

  1. 数控车椭圆编程实例带图_数控车床椭圆怎么编程
  2. 攻防世界-MISC:glance-50
  3. 初级程序员软考重点6 数据结构与算法
  4. 【误差】方差、标准差、均方误差和均方根误差的区别总结
  5. cubemx 配置多通道ADC进行ADC采样
  6. windows录屏html文件,win7系统自带的屏幕录制工具如何打开使用
  7. web界面测试用例(shelley_shu)
  8. 台式计算机usb口不识别鼠标,总算找到无法识别usb鼠标设备怎么办
  9. 使用蒙特卡罗方法计算圆周率π Python
  10. shell脚本中等待上一条命令执行结束在执行下一条。