简单理解遵循接口隔离原则的Java设计模式编程

 更新时间:2016年02月03日 11:55:38   作者:lixiang0522  
这篇文章主要介绍了遵循接口隔离原则的Java设计模式编程,针对Java编程中interface接口方面的编写进行约束,需要的朋友可以参考下

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。
举例来说明接口隔离原则:

201623115321799.jpg (514×337)

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

我们首先先看一个违反接口隔离的例子:

public interface IWorker { 
  public void work(); 
  public void eat(); 
} 
 
public class Worker implements IWorker{ 
  @Override 
  public void work() { 
    // TODO 工人工作   
  } 
 
  @Override 
  public void eat() { 
    // TODO 工人吃饭 
  } 
} 
 
public class Robot implements IWorker { 
  @Override 
  public void work() { 
    // TODO 机器人工作     
  } 
 
  @Override 
  public void eat() { 
    // TODO 机器人吃饭?  
  } 
} 


由于机器人是不需要吃饭的,所以IWorker被认为是一个臃肿的接口,当然你也可以在Robot类中的eat方法做空实现,但是这样可能会产生不可预计的BUG,比如eat方法需要消耗盒饭数量的话,就会出现不对应的现象。
下面是修改后的实现:

public interface IWorker { 
  public void work(); 
} 
 
public interface IDiet { 
  public void eat(); 
} 
 
public class Worker implements IWorker, IDiet{ 
  @Override 
  public void work() { 
    // TODO 工人工作   
  } 
 
  @Override 
  public void eat() { 
    // TODO 工人吃饭 
  } 
} 
 
public class Robot implements IWorker { 
  @Override 
  public void work() { 
    // TODO 机器人工作     
  } 
} 


总结:
1. 接口要尽量小,并高内聚,不过要适当,太细化不好维护。
2. 如果已经设计成了臃肿的接口,可以使用适配器模式隔离它。

相关文章

  • Java web项目中的强制登录功能实现代码

    Java web项目中的强制登录功能实现代码

    本文给大家分享Java web项目中的强制登录功能实现代码,为了避免直接进入项目中存在的页面,使用filter过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • Java实现插入排序,希尔排序和归并排序

    Java实现插入排序,希尔排序和归并排序

    这篇文章主要为大家详细介绍了插入排序,希尔排序和归并排序的多种语言的实现(JavaScript、Python、Go语言、Java),感兴趣的小伙伴可以了解一下
    2022-12-12
  • java使用FFmpeg提取音频的实现示例

    java使用FFmpeg提取音频的实现示例

    在Java开发中,我们经常会遇到需要使用FFmpeg来处理音视频文件的情况,本文主要介绍了java使用FFmpeg提取音频的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java数据长度获取方式对比之length属性、length()和size()方法详解

    Java数据长度获取方式对比之length属性、length()和size()方法详解

    在Java编程语言中length、length()和size()是三个常见的用来获取不同数据类型对象长度或大小的方法,但它们各自适用于不同的上下文,这篇文章主要给大家介绍了关于Java数据长度获取方式对比之length属性、length()和size()方法详解
    2024-07-07
  • Java通过反射将 Excel 解析成对象集合实例

    Java通过反射将 Excel 解析成对象集合实例

    这篇文章主要介绍了Java通过反射将 Excel 解析成对象集合实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java集成和使用dl4j实现通过扫描图片识别快递单信息

    Java集成和使用dl4j实现通过扫描图片识别快递单信息

    这篇文章主要为大家详细介绍了Java如何使用DL4J搭建一个简单的图像识别模型,并将其集成到Spring Boot后端中从而实现通过扫描图片识别快递单信息,需要的可以参考下
    2024-12-12
  • Spring Security自定义异常 AccessDeniedHandler不生效解决方法

    Spring Security自定义异常 AccessDeniedHandler不生效解决方法

    本文主要介绍了Spring Security自定义异常 AccessDeniedHandler不生效解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java异常类型及处理详情

    Java异常类型及处理详情

    这篇文章主要介绍了Java异常类型及处理, 异常指的是程序在执行过程中,出现了非正常情况,导致了java的jvm停止。感兴趣的小伙伴就和小编一起来学习下面文章的具体内容吧
    2021-09-09
  • JSON.parseObject和JSON.toJSONString实例详解

    JSON.parseObject和JSON.toJSONString实例详解

    这篇文章主要为大家详细介绍了JSON.parseObject和JSON.toJSONString实例,具有一定的参考价值,感兴趣的朋友可以参考一下
    2018-06-06
  • Java实现断点续传功能的示例代码

    Java实现断点续传功能的示例代码

    这篇文章主要为大家详细介绍了如何利用Java语言实现网络资源的断点续传功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2022-10-10

最新评论