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 分钟前
【开题答辩全过程】以 公寓出租系统为例,包含答辩的问题和答案
java·eclipse·echarts
Hello World呀8 分钟前
Minio的替代品RustFS
java
爱笑的眼睛1110 分钟前
强化学习组件:超越Hello World的架构级思考与实践
java·人工智能·python·ai
十月南城31 分钟前
多级缓存设计思路——本地 + 远程的一致性策略、失效风暴与旁路缓存的取舍
后端
悟能不能悟31 分钟前
java 设置日期返回格式的几种方式
java·开发语言
爱笑的眼睛1133 分钟前
深入解析PyTorch nn模块:超越基础模型构建的高级技巧与实践
java·人工智能·python·ai
Smile_25422041835 分钟前
解决本地 Windows 开发机无法注册到 PowerJob 服务器的问题
java·tcp/ip
float_六七37 分钟前
Spring AOP连接点实战解析
java·后端·spring
武子康1 小时前
大数据-183 Elasticsearch - 并发冲突与乐观锁、分布式数据一致性剖析
大数据·后端·elasticsearch
while(1){yan}1 小时前
基于IO流的三个小程序
java·开发语言·青少年编程