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();
    }
}
相关推荐
毕设源码_钟学姐2 分钟前
计算机毕业设计springboot宿舍管理信息系统 基于Spring Boot的高校宿舍管理平台设计与实现 Spring Boot框架下的宿舍管理系统开发
spring boot·后端·课程设计
贱贱的剑18 分钟前
2.单例模式
单例模式·设计模式
方圆想当图灵43 分钟前
ScheduledFutureTask 踩坑实录
后端
全栈凯哥1 小时前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A11 小时前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Top`1 小时前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
是小崔啊2 小时前
tomcat源码02 - 理解Tomcat架构设计
java·tomcat
没有bug.的程序员2 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
栈溢出了2 小时前
MyBatis实现分页查询-苍穹外卖笔记
java·笔记·mybatis