D de SOLID: Inversion de dépendance – Rapide exemple Java

L’inversion de dépendance fait partie des concepts SOLID. Bon, des explications théoriques sur l’inversion de dépendance, on en trouve partout sur le net. Je vais essayer de faire un petit exemple en Java pour comprendre autrement.

La lampe et l’ampoule

Nous sommes un fabriquant de lampe de nom “MyLamp”. Notre lampe aura une fonction “turnOn” qui permet d’allumer (light) une ampoule. Du coup, nous avons besoin d’un ampoule, nous allons prendre celui de la marque A (BulbA). Nous allons installer notre lampe dans la maison de notre client (CustomerHouse).


class BulbA {
	
	public void light() {
		System.out.println("light with BulbA");
	}
	
}

class MyLamp {
	
	public void turnOn() {
		BulbA bulb = new BulbA();
		bulb.light();
	}
	
}

class CustomerHouse {

	public static void main(String [] args) {
		MyLamp lamp = new MyLamp();
		lamp.turnOn();
	}
	
}

Bon, super, l’ampoule s’allume si on appuie sur la lampe. Mon client est très content. Par contre, il serait intéressé pour une deuxième lampe, mais il aimerait utiliser cette fois-ci avec une ampoule de marque B.

L’objet MyLamp est fortement couplée avec l’objet BulbA. Je ne peux pas utiliser une autre ampoule. Du coup, je fais comment ?

La dépendance ampoule

Pour ceci, on va injecter la dépendance de l’ampoule à ma lampe: La lampe ne va pas construire l’ampoule, mais va recevoir (ou injecter) cette dépendance.

Ainsi, on a besoin d’une interface liée aux ampoules (Bulb) afin de manipuler une ampoule générique. Mes deux ampoules implémentent cette interface. La lampe n’a que faire de la marque de l’ampoule, elle se base uniquement de l’interface.


interface Bulb {
	
	void light();
	
}

class BulbA implements Bulb {
	
	public void light() {
		System.out.println("light with BulbA");
	}
	
}

class BulbB implements Bulb {
	public void light() {
		System.out.println("light with BulbB");
	}
}

class MyLamp {
	
	private Bulb bulb;
	
	public MyLamp(Bulb bulb) {
		this.bulb = bulb;
	}
	
	public void turnOn() {
		bulb.light();
	}
	
}

class CustomerHouse {

	public static void main(String [] args) {
		MyLamp lamp1 = new MyLamp(new BulbA());
		lamp1.turnOn();
		MyLamp lamp2 = new MyLamp(new BulbB());
		lamp2.turnOn();
	}
	
}

 

On injecte la dépendance par rapport au constructeur de l’objet. on pourrait l’injecter aussi via un setter ou bien avec un design pattern d’Inversion de contrôle comme le framework Spring.

J’espère que ce petit exemple vous aidera à mieux comprendre le principe. Si ce n’est pas clair, n’hésitez pas à poser vos questions.

1 thought on “D de SOLID: Inversion de dépendance – Rapide exemple Java”

  1. Pingback: Architecture hexagonale: Prends ton livre et n’fais pas de bruit dans ma bibliothèque !! – La pause Dev'

Leave a Reply

Your email address will not be published. Required fields are marked *