当前位置: 首页 > article >正文

Java中接口隔离原则简介和代码举例

简介:

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计SOLID原则中的“I”,其核心思想是:

定义

客户端不应被迫依赖它不使用的方法。即,一个类对另一个类的依赖应建立在最小的接口上,避免实现臃肿的接口。


核心思想

核心思想

  1. 拆分“胖接口”
    将包含多个功能的庞大接口拆分为多个小而专注的接口,每个接口代表一个特定的职责。

  2. 按需实现
    类只需实现与自身功能相关的接口,避免因实现无关方法而引入冗余或错误(如空方法、抛异常等)。


  1. 与单一职责原则(SRP)的区别

  2. SRP:关注类的职责单一性(一个类只做一件事)。

  3. ISP:关注接口的细粒度设计(一个接口只服务一个功能模块)。


实践建议

  1. 按角色划分接口
    如用户权限系统中,将AdminRole(管理权限)和GuestRole(浏览权限)分离,避免普通用户类被迫实现管理员方法。

  2. 组合优于继承
    通过组合多个小接口实现灵活的功能复用,而非继承一个庞大接口。

  3. 识别依赖边界
    若某个接口的部分方法被多个类频繁忽略,说明需要拆分。


优势

  • 降低耦合:减少类之间的不必要依赖。

  • 提高可维护性:接口变更的影响范围更小。

  • 增强灵活性:通过组合接口实现功能的按需扩展。


代码举例:

假如有ABCD四个类,A,C需要依赖B,D类中的方法,B,D依赖一个类

下列示例中发现,B和D都有多余的方法,因为A只依赖了1,2,3方法,4,5没有依赖

interface interface1{
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}
class B implements interface1{
    @Override
    public void operation1() {
        System.out.println("B中实现了operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B中实现了operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B中实现了operation3");
    }

    @Override
    public void operation4() {
        System.out.println("B中实现了operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B中实现了operation5");
    }
}//B
class D implements interface1{
    @Override
    public void operation1() {
        System.out.println("D中实现了operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D中实现了operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D中实现了operation3");
    }

    @Override
    public void operation4() {
        System.out.println("D中实现了operation4");
    }

    @Override
    public void operation5() {
        System.out.println("D中实现了operation5");
    }
}//B
class A{//A类通过接口使用B类,只会用到1,2,3个方法
    public void depend1(interface1 i){
        i.operation1();
    }
    public void depend2(interface1 i){
        i.operation2();
    }
    public void depend3(interface1 i){
        i.operation3();
    }
}//B
class C{
    public void depend1(interface1 i){
        i.operation1();
    }
    public void depend2(interface1 i){
        i.operation4();
    }
    public void depend3(interface1 i){
        i.operation5();
    }
}

代码改善:

通过对接口的拆分,使得B,D都依赖了最小接口,没有造成浪费

interface interface1{
    void operation1();
}
//接口2
interface interface2{
    void operation2();
    void operation3();
}
//接口3
interface interface3{
    void operation4();
    void operation5();
}
class B implements interface1, interface2 {
    @Override
    public void operation1() {
        System.out.println("B中实现了operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B中实现了operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B中实现了operation3");
    }

}//B
class D implements interface1, interface3 {
    @Override
    public void operation1() {
        System.out.println("D中实现了operation1");
    }

    @Override
    public void operation4() {
        System.out.println("D中实现了operation4");
    }

    @Override
    public void operation5() {
        System.out.println("D中实现了operation5");
    }
}//B
class A{//A类通过接口使用B类,只会用到1,2,3个方法
    public void depend1(interface1 i){
        i.operation1();
    }
    public void depend2(interface2 i){
        i.operation2();
    }
    public void depend3(interface2 i){
        i.operation3();
    }
}//A
class C{
    public void depend1(interface1 i){
        i.operation1();
    }
    public void depend2(interface3 i){
        i.operation4();
    }
    public void depend3(interface3 i){
        i.operation5();
    }
}

 

总结

接口隔离原则通过定义精准的接口边界,确保系统各部分依赖最小化,从而提升代码的健壮性和可维护性。合理应用ISP,能有效避免“接口污染”,使设计更符合高内聚、低耦合的原则。

  1. 拆分“胖接口”
    将包含多个功能的庞大接口拆分为多个小而专注的接口,每个接口代表一个特定的职责。

  2. 按需实现
    类只需实现与自身功能相关的接口,避免因实现无关方法而引入冗余或错误(如空方法、抛异常等)。

  3. 与单一职责原则(SRP)的区别

  4. SRP:关注类的职责单一性(一个类只做一件事)。

  5. ISP:关注接口的细粒度设计(一个接口只服务一个功能模块)。

  6. 按角色划分接口
    如用户权限系统中,将AdminRole(管理权限)和GuestRole(浏览权限)分离,避免普通用户类被迫实现管理员方法。

  7. 组合优于继承
    通过组合多个小接口实现灵活的功能复用,而非继承一个庞大接口。

  8. 识别依赖边界
    若某个接口的部分方法被多个类频繁忽略,说明需要拆分。

  9. 降低耦合:减少类之间的不必要依赖。

  10. 提高可维护性:接口变更的影响范围更小。

  11. 增强灵活性:通过组合接口实现功能的按需扩展。


http://www.kler.cn/a/590697.html

相关文章:

  • 论文速递| ECG去噪新方法:小波+ CNN提升可穿戴精度
  • CMAKE学习系列(002)--- 如何添加宏定义
  • vulnhub靶场之loly靶机
  • 5-26 黑白照片上色-Recolor
  • Java学习------static、final、this、super关键字
  • PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
  • Redis,从数据结构到集群的知识总结
  • 基于javaweb的SpringBoot智能相册管理系统图片相册系统设计与实现(源码+文档+部署讲解)
  • 分布式锁: 并发时,redis如何避免删别人的锁
  • 如何用DeepSeek进行项目管理?AI重构项目全生命周期的实践指南
  • C51 Proteus仿真实验17:数码管显示4×4键盘矩阵按键
  • 力扣No.376.摆动序列
  • 【从零开始学习计算机科学】设计模式(一)设计模式概述
  • 蓝桥杯嵌入式赛道复习笔记2(按键控制LED灯,双击按键,单击按键,长按按键)
  • Mysql篇——SQL优化
  • Excel进阶篇:数据透视表详解 数据透视表进阶 切片器 配色
  • 如何使用HACS一键集成米家与果家设备到HomeAssistant玩转智能家居
  • 《我的Python觉醒之路》之转型Python(十五)——控制流
  • 智能化营销:唤醒沉睡客户,驱动企业利润增长
  • C++Qt开发流程图效果,包括保存、加载功能