依赖倒置原则(Dependency Inversion Principle,简称DIP)是面向对象设计中的一个原则,它强调高层模块不应该依赖于底层模块,二者都应该依赖于抽象;而抽象不应该依赖于细节,细节应该依赖于抽象。简而言之,依赖倒置原则要求通过抽象(接口或抽象类)来实现模块之间的松耦合。

反例:

class LightBulb {
    public void turnOn() {
        // 点亮灯泡的逻辑
    }

    public void turnOff() {
        // 关闭灯泡的逻辑
    }
}

class Switch {
    private LightBulb bulb;

    public Switch() {
        this.bulb = new LightBulb();
    }

    public void operate() {
        if (bulb.isOn()) {
            bulb.turnOff();
        } else {
            bulb.turnOn();
        }
    }
}

在上面的例子中,Switch 类直接依赖于具体的 LightBulb 类。这违反了依赖倒置原则,因为高层模块 Switch 依赖于底层模块 LightBulb,而且具体的细节已经硬编码在高层模块中。

正例:

interface Switchable {
    void turnOn();

    void turnOff();
}

class LightBulb implements Switchable {
    @Override
    public void turnOn() {
        // 点亮灯泡的逻辑
    }

    @Override
    public void turnOff() {
        // 关闭灯泡的逻辑
    }
}

class Fan implements Switchable {
    @Override
    public void turnOn() {
        // 打开风扇的逻辑
    }

    @Override
    public void turnOff() {
        // 关闭风扇的逻辑
    }
}

class Switch {
    private Switchable device;

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

    public void operate() {
        if (device.isOn()) {
            device.turnOff();
        } else {
            device.turnOn();
        }
    }
}

在正例中,Switch 类依赖于抽象的 Switchable 接口,而不是具体的细节。LightBulb 和 Fan 类都实现了 Switchable 接口,这样 Switch 类不再依赖于具体的实现,而是依赖于抽象的接口。这符合依赖倒置原则,高层模块和底层模块都依赖于抽象,降低了耦合度,提高了系统的灵活性和可维护性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注