Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)

文章目录

    • [3.4 接口隔离原则(ISP)](#3.4 接口隔离原则(ISP))
      • [3.4.1 概述](#3.4.1 概述)
      • [3.4.2 案列](#3.4.2 案列)

3.4 接口隔离原则(ISP)

接口隔离原则:Interface Segregation Principle,简称ISP

3.4.1 概述

客户端测试类不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

3.4.2 案列

面看一个例子来理解接口隔离原则:

【例】安全门案例

需求:创建一个学校品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。类图如下:

java 复制代码
// 防盗门
public interface SafetyDoor {
    //防盗功能
    public abstract void antiTheft();
    // 防火功能
    public abstract void fireproof();
    // 防水功能
    public abstract void waterproof();
}
==========================================================
  //学校防盗门类 实现防盗门接口
  public class SchoolDoor implements SafetyDoor {

    @Override
    public void antiTheft() {
        System.out.println("防盗");
    }

    @Override
    public void fireproof() {
        System.out.println("防火");
    }

    @Override
    public void waterproof() {
        System.out.println("防水");
    }
}
============================================================
  public class ClientTest {
    public static void main(String[] args) {

        // 创建学校防盗门对象
        SchoolDoor schoolDoor = new SchoolDoor();
        // 调用方法实现防盗门的功能
        schoolDoor.antiTheft();
        schoolDoor.waterproof();
        schoolDoor.fireproof();
    }
}

上述代码看似实现了需求的功能,但是如果加入新增一个家庭品牌的安全门,有防盗功能和防火功能,此时如果再定义一个家庭安全门类去实现安全门的接口会造成家庭安全门被迫去实现防水功能,这就违背了接口隔离原则。

根据接口隔离原则,改进如下:

java 复制代码
// 防盗接口
public interface AntiTheft {
    public abstract void antiTheft();
}
===========================================================
  // 防火接口
public interface Fireproof {
    public abstract void fireproof();
}
===========================================================
  // 防水接口
public interface Waterproof {
    public abstract void waterproof();
}
==========================================================
  //创建学校防盗门,实现该有功能的接口
nmpublic class SchoolDoor implements AntiTheft,Fireproof,Waterproof{
    @Override
    public void antiTheft() {
        System.out.println("防盗");
    }

    @Override
    public void fireproof() {
        System.out.println("防火");
    }

    @Override
    public void waterproof() {
        System.out.println("防水");
    }
}
=========================================================
  //新增家庭品牌安全门 实现该有功能的接口
  public class HomeDoor implements AntiTheft,Fireproof{
    @Override
    public void antiTheft() {
        System.out.println("防盗");
    }

    @Override
    public void fireproof() {
        System.out.println("防火");
    }
}
===========================================================
  public class ClientTest {
    public static void main(String[] args) {
        // 创建学校防盗门
        SchoolDoor s = new SchoolDoor();
        // 实现学校防盗门功能
        s.fireproof();
        s.waterproof();
        s.antiTheft();
      
        // 创建家庭品牌安全门
        HomeDoor homeDoor = new HomeDoor();
        //实现家庭品牌安全门的功能
        homeDoor.antiTheft();
        homeDoor.fireproof();
    }
}
相关推荐
暮色妖娆丶1 小时前
不过是吃了几年互联网红利罢了,我高估了自己
java·后端·面试
UrbanJazzerati2 小时前
Python Scrapling:小白也能轻松掌握的现代网页抓取工具
后端·面试
老张的码2 小时前
飞书 × OpenClaw 接入指南
人工智能·后端
希克厉2 小时前
记录安装wsl2踩的一个坑
后端
zone77392 小时前
004:RAG 入门-LangChain读取PDF
后端·python·面试
漫霂2 小时前
基于redis实现登录校验
redis·后端
zone77392 小时前
005:RAG 入门-LangChain读取表格数据
后端·python·agent
NE_STOP2 小时前
MyBatis-参数处理与查询结果映射
java
用户7344028193422 小时前
mysql如何存储boolean类型
后端
golang学习记2 小时前
Fiber v3 适配器模式:17 种写法随便用,老代码"即插即用"🔌
后端·go