Rajat's Notes

Personal knowledge based for Tech, Interviews and many more.

This project is maintained by im-Rajat

Dependency Inversion Principle

Bad Implementation :

// High-level module
class LightSwitch {
    private Bulb bulb;

    public LightSwitch() {
        this.bulb = new LEDBulb();  // High-level module depends on a specific low-level module
    }

    public void turnOn() {
        bulb.turnOn();
    }

    public void turnOff() {
        bulb.turnOff();
    }
}

// Low-level module
class LEDBulb {
    public void turnOn() {
        // Code to turn on an LED bulb
    }

    public void turnOff() {
        // Code to turn off an LED bulb
    }
}

Good Implementation :

// High-level module
class LightSwitch {
    private Bulb bulb;

    public LightSwitch(Bulb bulb) {
        this.bulb = bulb; // High-level module depends on an abstraction
    }

    public void turnOn() {
        bulb.turnOn();
    }

    public void turnOff() {
        bulb.turnOff();
    }
}

// Abstraction (Interface)
interface Bulb {
    void turnOn();
    void turnOff();
}

// Low-level modules implementing the abstraction
class LEDBulb implements Bulb {
    public void turnOn() {
        // Code to turn on an LED bulb
    }

    public void turnOff() {
        // Code to turn off an LED bulb
    }
}

class CFLBulb implements Bulb {
    public void turnOn() {
        // Code to turn on an CFL bulb
    }

    public void turnOff() {
        // Code to turn off an CFL bulb
    }
}