Java设计模式 | 七大原则之接口隔离原则

接口隔离原则(Interface Segregation Principle)

基本介绍

  1. 客户端不应该依赖他不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上
  2. 如下图
  1. A类通过接口Interface1依赖B类,C类通过接口Interface1依赖D类。如果Interface1对于A类和C类来说不是最小接口,那么B类和D类必须去实现他们不需要的方法
  2. 遵循接口隔离原则应这样处理:将接口Interface1拆分为独立的几个接口,A类和C类分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则

应用实例

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * User: Mingda
 * Time: 2024/2/23 17:05
 * File: Segregation1
 * Description: 接口隔离原则
 */
public class Segregation1 {

    public static void main(String[] args) {
        A a = new A();

        // A类通过接口去依赖B类
        a.method1(new B());
        a.method2(new B());
        a.method3(new B());

        C c = new C();
        // C类通过接口去依赖D类
        c.method1(new D());
        c.method4(new D());
        c.method5(new D());
    }
}

// 接口
interface Interface1 {
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}

// B类
class B implements Interface1 {
    public void operation1() {
        System.out.println("B operation1");
    }

    public void operation2() {
        System.out.println("B operation2");
    }

    public void operation3() {
        System.out.println("B operation3");
    }

    public void operation4() {
        System.out.println("B operation4");
    }

    public void operation5() {
        System.out.println("B operation5");
    }
}

// D类
class D implements Interface1 {
    public void operation1() {
        System.out.println("D operation1");
    }

    public void operation2() {
        System.out.println("D operation2");
    }

    public void operation3() {
        System.out.println("D operation3");
    }

    public void operation4() {
        System.out.println("D operation4");
    }

    public void operation5() {
        System.out.println("D operation5");
    }
}

/**
 * A类通过接口Interface1依赖(使用)B类,但是只会使用operation1()、operation2()、operation3()方法
 */
class A {
    public void method1(Interface1 i) {
        i.operation1();
    }

    public void method2(Interface1 i) {
        i.operation2();
    }
    public void method3(Interface1 i) {
        i.operation3();
    }
}

/**
 * C类通过接口Interface1依赖(使用)D类,但是只会使用operation1()、operation4()、operation5()方法
 */
class C {

    public void method1(Interface1 i) {
        i.operation4();
    }

    public void method4(Interface1 i) {
        i.operation4();
    }

    public void method5(Interface1 i) {
        i.operation5();
    }
}
java 复制代码
/**
 * Created with IntelliJ IDEA.
 * User: Mingda
 * Time: 2024/2/23 17:05
 * File: Segregation1
 * Description: 接口隔离原则
 */
public class Segregation2 {

    public static void main(String[] args) {
        A a = new A();

        // A类通过接口去依赖B类
        a.method1(new B());
        a.method2(new B());
        a.method3(new B());

        C c = new C();

        // C类通过接口去依赖D类
        c.method1(new D());
        c.method4(new D());
        c.method5(new D());
    }
}

// 接口1
interface Interface1 {
    void operation1();
}

// 接口2
interface Interface2 {
    void operation2();
    void operation3();
}

// 接口3
interface Interface3 {
    void operation4();
    void operation5();
}

// B类
class B implements Interface1, Interface2 {
    public void operation1() {
        System.out.println("B operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B operation3");
    }
}

// D类
class D implements Interface1, Interface3 {
    public void operation1() {
        System.out.println("D operation1");
    }

    @Override
    public void operation4() {
        System.out.println("D operation4");
    }

    @Override
    public void operation5() {
        System.out.println("D operation5");
    }
}

/**
 * A类通过接口Interface1、Interface2依赖(使用)B类,使用operation1()、operation2()、operation3()方法
 */
class A {
    public void method1(Interface1 i) {
        i.operation1();
    }

    public void method2(Interface2 i) {
        i.operation2();
    }
    public void method3(Interface2 i) {
        i.operation3();
    }
}

/**
 * C类通过接口Interface1、Interface3依赖(使用)D类,使用operation1()、operation4()、operation5()方法
 */
class C {

    public void method1(Interface1 i) {
        i.operation1();
    }

    public void method4(Interface3 i) {
        i.operation4();
    }

    public void method5(Interface3 i) {
        i.operation5();
    }
}

github笔记

相关推荐
yaoxin52112330 分钟前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F36 分钟前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
2601_962072212 小时前
SpringMVC进阶(自定义拦截器以及异常处理)
java
2601_962073812 小时前
Spring全面详解(基础版)
java·后端·spring
谢亮_vipxieliang3 小时前
ValidX分组验证详解:不同场景使用不同验证规则
java·spring boot·后端·spring cloud·eclipse·hibernate
wuminyu4 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
pnoker4 小时前
IoT DC3 AI 能力:Agentic Center 的设计与边界
java·人工智能·物联网·大模型·spring ai
xiaoqiMikko4 小时前
一条 CVSS 9.0 的 RCE,advisory 里没写修复版是哪个 —— fastjson 16723 的字段考古
java·安全
程序员贺加贝4 小时前
一次 SaaS ERP 主数据生命周期设计:Policy、PreCheck 与结构化阻断原因
java·后端·架构·saas
catino5 小时前
spring-Bean
java·后端·spring