High-level modules should not depend on low-level modules. Both should depend on abstractions.

Example: Consider a Light class that directly controls a Switch.

// Violation of DIP
public class LightSwitch {
    private Light light;

    public LightSwitch(Light light) {
        this.light = light;
    }

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

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

// Following DIP
public interface Switchable {
    void turnOn();
    void turnOff();
}

public class Light implements Switchable {
    public void turnOn() {
        System.out.println("Light is On");
    }

    public void turnOff() {
        System.out.println("Light is Off");
    }
}

public class Fan implements Switchable {
    public void turnOn() {
        System.out.println("Fan is On");
    }

    public void turnOff() {
        System.out.println("Fan is Off");
    }
}

public class Switch {
    private Switchable device;

    public Switch(Switchable device) {
        this.device = device;
    }

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

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

Now, the Switch class depends on the Switchable interface, which could be a Light, Fan, or any other device, making the code flexible and adherent to DIP.

Previous: Interface Segregation Principle (ISP)

NextSOLID


Leave a Reply

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