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();
    }
}
相关推荐
实名上网宋凯宣6 小时前
Django
后端·python·django
天河归来7 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL8 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu8 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF9 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
砚底藏山河9 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间9 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu9 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
猿究院_夏燊10 小时前
MySQL 的四种隔离级别
java·数据库·mysql
薛定谔的猫-菜鸟程序员10 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师