TOP6. Principio de inversión de dependencia-principio de diseño orientado a objetos

         Confíe en la definición del principio de inversión

El papel del principio de dependencia e inversión.

Confíe en el método de realización del principio de inversión


Confíe en la definición del principio de inversión


Principio de inversión de dependencia (DIP) es  un artículo publicado por Robert C. Martin, presidente de Object Mentor Company, en C ++ Report en 1996  .

La definición original del principio de inversión de dependencia es: los módulos de alto nivel no deben depender de módulos de bajo nivel, y ambos deben depender de sus abstracciones; la abstracción no debe depender de detalles y los detalles deben depender de abstracciones (los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones) .Las abstracciones no deben depender de los detalles. Los detalles deben depender de las abstracciones). La idea central es: programación orientada a la interfaz, no programación orientada a la implementación.

El principio de inversión de dependencia es una de las formas importantes de realizar el principio de apertura y cierre, que reduce el acoplamiento entre el cliente y el módulo de implementación.

En el diseño de software, los detalles son cambiantes y la capa de abstracción es relativamente estable, por lo que la arquitectura basada en la abstracción es mucho más estable que la arquitectura basada en los detalles. El resumen aquí se refiere a la interfaz o clase abstracta, y el detalle se refiere a la clase de implementación específica.

El propósito de usar interfaces o clases abstractas es formular especificaciones y contratos sin involucrar operaciones específicas, y delegar la tarea de revelar detalles a sus clases de implementación.

El papel del principio de dependencia e inversión.


Las principales funciones del principio de inversión de dependencia son las siguientes.

  • Confiar en el principio de inversión puede reducir el acoplamiento entre clases.
  • Confiar en el principio de inversión puede mejorar la estabilidad del sistema.
  • Confiar en el principio de inversión puede reducir los riesgos causados ​​por el desarrollo paralelo.
  • Confiar en el principio de inversión puede mejorar la legibilidad y el mantenimiento del código.

Confíe en el método de realización del principio de inversión


El propósito del principio de inversión de dependencia es reducir el acoplamiento entre clases a través de la programación orientada a la interfaz, por lo que solo necesitamos seguir los siguientes 4 puntos en la programación real para cumplir con esta regla en el proyecto.

  1. Cada clase intenta proporcionar una interfaz o una clase abstracta, o ambas.
  2. El tipo de declaración de la variable debe ser una interfaz o una clase abstracta tanto como sea posible.
  3. Ninguna clase debe derivarse de una clase concreta.
  4. Intente seguir el principio de sustitución de Richter cuando utilice la herencia.


A continuación se utiliza el "programa de compras del cliente" como ejemplo para ilustrar la aplicación del principio de dependencia de la inversión.

[Ejemplo 1] La aplicación del principio de inversión de dependencia en el "programa de compra del cliente".

Análisis: este programa refleja la relación entre "clase de cliente" y "clase de tienda". Existe un método sell () en la clase de tienda, a través del cual la clase de cliente realiza compras. El siguiente código define la clase de cliente para comprar a través de ShaoguanShop:

class Customer {
    public void shopping(ShaoguanShop shop) {
        // 购物
        System.out.println(shop.sell());
    }
}

Sin embargo, este diseño tiene desventajas. Si el cliente desea comprar en otra tienda (como WuyuanShop), el código del cliente debe modificarse de la siguiente manera:

class Customer {
    public void shopping(WuyuanShop shop) {
        // 购物
        System.out.println(shop.sell());
    }
}

Los clientes tienen que modificar el código cada vez que cambian de tienda, lo que obviamente viola el principio de apertura y cierre. La razón de las deficiencias anteriores es que la clase de cliente está vinculada a la clase de tienda específica durante el diseño, lo que viola el principio de inversión de dependencia. La solución es definir la interfaz común Tienda de la "Tienda en línea de Wuyuan" y la "Tienda en línea de Shaoguan". La clase de cliente está programada para esta interfaz y el código se modifica de la siguiente manera:

class Customer {
    public void shopping(Shop shop) {
        // 购物
        System.out.println(shop.sell());
    }
}

De esta manera, no importa qué tienda visita la clase del cliente o agrega una nueva tienda, no hay necesidad de modificar el código original, el diagrama de clases se muestra en la Figura 1.
 

Diagrama de clases del programa de compras del cliente.


                                                                      Figura 1 Diagrama de clases del programa de compras del cliente


El código del programa es el siguiente:

package principle;

public class DIPtest {
    public static void main(String[] args) {
        Customer wang=new Customer();
        System.out.println("顾客购买以下商品:"); 
        wang.shopping(new ShaoguanShop()); 
        wang.shopping(new WuyuanShop());
    }
}
// 商店
interface Shop {
    public String sell(); //卖
}
// 韶关网店
class ShaoguanShop implements Shop {
    public String sell() {
        return "韶关土特产:香菇、木耳……"; 
    } 
}
// 婺源网店
class WuyuanShop implements Shop {
    public String sell() {
        return "婺源土特产:绿茶、酒糟鱼……"; 
    }
} 
// 顾客
class Customer {
    public void shopping(Shop shop) {
        // 购物
        System.out.println(shop.sell()); 
    }
}

Los resultados del programa son los siguientes:

顾客购买以下商品:
韶关土特产:香菇、木耳……
婺源土特产:绿茶、酒糟鱼……

<Principio de sustitución de Liskov Principio                                                                                                                                                           de responsabilidad única>

Supongo que te gusta

Origin blog.csdn.net/m0_38023584/article/details/106344018
Recomendado
Clasificación