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笔记

相关推荐
蔬菜_15 分钟前
前端转全栈-day2(修饰符)
java
fīɡЙtīиɡ ℡18 分钟前
怎么是用JWT
java·状态模式
唐青枫25 分钟前
Java JCommander 实战详解:用注解解析命令行参数
java
步行cgn1 小时前
carList.forEach(System.out::println)
java·开发语言·mybatis
plainGeekDev1 小时前
JUnit 4 → JUnit 5 + Kotlin
android·java·kotlin
plainGeekDev1 小时前
Mockito → MockK
android·java·kotlin
Zane19942 小时前
ThreadLocal 与 BlockingQueue:线程本地变量的内存泄漏原理,以及阻塞队列怎么选?
java·后端
用户3126874877202 小时前
Spring Bean 生命周期到底经历了什么?从实例化到销毁的全链路拆解
java·spring boot
Flittly2 小时前
【我的手搓轮子日记】(2)handmade-ioc 手搓 IOC 容器
java·spring boot·spring
阿昌喜欢吃黄桃2 小时前
Dubbo服务重启时注册中心下线不及时问题排查与修复记录
java·rpc·dubbo·问题排查