Pequeña charla sobre patrones de diseño (6): principio de inversión de dependencia

Introducción a la columna

Dirección de columna

enlace

Introducción a la columna

Principalmente analiza y resume uno por uno los 23 patrones de diseño comunes actualmente en el mercado, espero que los amigos interesados ​​puedan echarle un vistazo y se actualizará continuamente. Espero que puedan supervisarme y podamos aprender y progresar juntos, vamos todos.
Insertar descripción de la imagen aquí

principio de inversión de dependencia

El Principio de Inversión de Dependencia (DIP) es un principio importante en el diseño orientado a objetos, que orienta cómo construir sistemas de software débilmente acoplados, escalables y mantenibles. Este principio fue propuesto por Robert C. Martin.

Idea principal

Desacople las dependencias entre módulos de alto nivel y módulos de bajo nivel mediante abstracción.
Insertar descripción de la imagen aquí

Análisis de puntos clave

a

Los módulos de alto nivel no deben depender de la implementación específica de módulos de bajo nivel, sino de interfaces abstractas. Esto significa que los módulos de alto nivel deben definir una interfaz abstracta y los módulos de bajo nivel implementan esta interfaz. Al confiar en interfaces abstractas, los módulos de alto nivel se pueden programar independientemente de implementaciones concretas.

b

Las interfaces abstractas deben definirse mediante módulos de alto nivel, no mediante módulos de bajo nivel. Esto garantiza que los módulos de alto nivel tengan control sobre las dependencias sin estar restringidos por los módulos de bajo nivel. Los módulos de alto nivel pueden definir métodos y propiedades de interfaz según sus propias necesidades sin depender de los detalles de implementación específicos de los módulos de bajo nivel.

C

La inyección de dependencia es un medio importante para implementar el principio de inversión de dependencia. Mediante la inyección de dependencias, los módulos de alto nivel pueden pasar objetos de clases de implementación concretas a interfaces abstractas. La inyección de dependencia se puede lograr mediante constructor, parámetro de método o inyección de propiedad. Esto puede lograr el desacoplamiento y los módulos de alto nivel no necesitan preocuparse por la creación y gestión de clases de implementación específicas.
Insertar descripción de la imagen aquí

Análisis de ventajas y desventajas

ventaja

Reducir el acoplamiento entre módulos.

A través del principio de inversión de dependencia, los módulos de alto nivel no dependen de la implementación específica de los módulos de bajo nivel, sino de interfaces abstractas. Esto puede reducir el acoplamiento entre módulos y mejorar la flexibilidad y la mantenibilidad del código.

Mejorar la escalabilidad del código

Dado que los módulos de alto nivel no dependen de la implementación específica de los módulos de bajo nivel, cuando es necesario agregar o modificar un módulo de bajo nivel, solo es necesario modificar la clase de implementación específica sin modificar el código del módulo de alto nivel. . Esto mejora la escalabilidad del código y reduce el impacto en el código existente.

Facilita las pruebas unitarias

Dado que los módulos de alto nivel se basan en interfaces abstractas, las pruebas unitarias se pueden realizar utilizando objetos simulados sin depender de clases de implementación concretas. Esto facilita las pruebas y mejora la calidad de su código.

Insertar descripción de la imagen aquí

defecto

Aumentar la complejidad del código

El principio de inversión de dependencia requiere la introducción de mecanismos como interfaces abstractas e inyección de dependencia, lo que aumentará la complejidad del código y la dificultad de comprenderlo. Especialmente en proyectos más pequeños o escenarios simples, introducir estos mecanismos puede parecer demasiado engorroso.

Requiere trabajo adicional de diseño y desarrollo.

Al aplicar el principio de inversión de dependencia, se requiere trabajo adicional de diseño y desarrollo, incluida la definición de interfaces abstractas, la implementación de clases de implementación concretas y la inyección de dependencias. Esto aumenta los costos y el esfuerzo de desarrollo.

En resumen, el principio de inversión de dependencia puede mejorar la flexibilidad, la mantenibilidad y la escalabilidad del código hasta cierto punto, pero también debe sopesarse con la complejidad y los costos de desarrollo que introduce. Durante el proceso de diseño y desarrollo, es necesario decidir si se adopta el principio de inversión de dependencia en función de escenarios y requisitos específicos.

Implementación de código Java

// 定义抽象接口
public interface MessageSender {
    
    
    void sendMessage(String message);
}

// 具体实现类1
public class EmailSender implements MessageSender {
    
    
    @Override
    public void sendMessage(String message) {
    
    
        System.out.println("Sending email: " + message);
    }
}

// 具体实现类2
public class SmsSender implements MessageSender {
    
    
    @Override
    public void sendMessage(String message) {
    
    
        System.out.println("Sending SMS: " + message);
    }
}

// 高层模块,依赖于抽象接口
public class NotificationService {
    
    
    private MessageSender messageSender;

    // 通过构造函数进行依赖注入
    public NotificationService(MessageSender messageSender) {
    
    
        this.messageSender = messageSender;
    }

    public void sendNotification(String message) {
    
    
        // 调用抽象接口的方法
        messageSender.sendMessage(message);
    }
}

// 测试代码
public class Main {
    
    
    public static void main(String[] args) {
    
    
        // 创建具体实现类的对象
        MessageSender emailSender = new EmailSender();
        MessageSender smsSender = new SmsSender();

        // 创建高层模块的对象,并传入具体实现类的对象
        NotificationService emailNotificationService = new NotificationService(emailSender);
        NotificationService smsNotificationService = new NotificationService(smsSender);

        // 调用高层模块的方法
        emailNotificationService.sendNotification("Hello, this is an email notification.");
        smsNotificationService.sendNotification("Hello, this is an SMS notification.");
    }
}

Insertar descripción de la imagen aquí

Análisis de ejemplo

El método de envío de mensajes se define en la interfaz abstracta MessageSender. Las clases de implementación específicas EmailSender y SmsSender implementan respectivamente esta interfaz y proporcionan implementaciones específicas para enviar correos electrónicos y enviar mensajes de texto. El módulo de alto nivel NotificationService se basa en la interfaz abstracta MessageSender y realiza la inyección de dependencia a través del constructor, implementando así el principio de inversión de dependencia.

Resumir

El principio de inversión de dependencia enfatiza la importancia de la programación orientada a lo abstracto: a través de tecnologías como interfaces abstractas e inyección de dependencia, se puede reducir el acoplamiento entre módulos y mejorar la flexibilidad y mantenibilidad del código.

Supongo que te gusta

Origin blog.csdn.net/weixin_74888502/article/details/133436775
Recomendado
Clasificación