「撸一手好代码」设计模式之接口隔离原则

「撸一手好代码」设计模式之接口隔离原则

什么是接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP)指出,客户端不应该依赖它不使用的接口。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。接口的设计应该尽量细化,每个接口只包含客户端所需的方法,而不是提供一个庞大臃肿的接口,迫使客户端依赖于它们不使用的方法。

为什么需要接口隔离原则

接口隔离原则的重要性体现在以下几个方面:

  1. 降低耦合度:细化接口可以减少类之间的依赖关系,降低系统的耦合度。
  2. 提高灵活性:当接口发生变化时,由于依赖关系的减少,受影响的类也会相应减少,提高了系统的灵活性。
  3. 易于维护和扩展:接口细化后,每个接口都更加专注于特定的功能,使得系统的维护和扩展变得更加容易。

如何应用接口隔离原则

在实际开发中,应用接口隔离原则需要注意以下几点:

  1. 识别客户端需求:首先,明确各个客户端的具体需求,了解它们需要哪些方法。
  2. 细化接口:根据客户端需求,将接口细化成多个小接口,每个接口只包含一组紧密相关的方法。
  3. 建立依赖关系:让客户端依赖于它们需要的接口,而不是依赖于一个庞大的接口。

接口隔离原则示例

反例(以Java代码为例)

以动物为例,有些动物能游泳,有些能飞。如果把所有的行为都定义在Animal接口中,必然导致部分动物无法实现其中部分行为。从另外一个角度,其又违背了里氏替换原则。

java 复制代码
public interface Animal {

    void eat();

    void sleep();

    void fly();
}
java 复制代码
public class Bird implements Animal{
    @Override
    public void eat() {
        System.out.println("Bird is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Bird is sleeping");
    }

    @Override
    public void fly() {
        System.out.println("Bird is flying");
    }
}
java 复制代码
public class Dog implements Animal{

    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }

    @Override
    public void fly() {
        System.out.println("Dog can't fly");
    }
}

后果

  • 系统耦合度增加,难以维护和扩展。
  • 当接口发生变化时,可能会影响多个不相关的客户端。

解决方案

  1. 细化接口:将一些特有的行为进行接口分离,定义独立的Flyable飞行能力接口。
  2. 重新设计客户端:让客户端依赖于它们真正需要的接口,而不是一个庞大的接口。
  3. 使用适配器模式:如果由于某些原因无法直接修改现有代码,可以使用适配器模式来封装不符合接口隔离原则的接口,为客户端提供一个符合其需求的更细化的接口。
java 复制代码
public interface Animal {

    void eat();

    void sleep();
}
java 复制代码
public interface Flyable {

    void fly();
}
java 复制代码
public class Bird implements Animal, Flyable {
    @Override
    public void eat() {
        System.out.println("Bird is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Bird is sleeping");
    }

    @Override
    public void fly() {
        System.out.println("Bird is flying");
    }
}
java 复制代码
public class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

结语

接口隔离原则是面向对象设计中一个非常重要的原则,它帮助我们设计出灵活、易维护的接口。通过遵循这一原则,我们可以降低系统的耦合度,提高灵活性,并使得系统的维护和扩展变得更加容易。

参考

https://zhuanlan.zhihu.com/p/130954951

相关推荐
Lhappy嘻嘻7 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒8 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚10 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我1234512 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑12 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ14 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案14 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅15 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp15 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47715 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程