依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

/**
 * 总开关接口
 */
public interface ISwitchable {
    void TurnOn();

    void TurnOff();
}

 

/**
 * 可以控制所有电器的控制开关类
 */
public class ToggleSwitch implements ISwitchable {
    private ISwitchable iSwitchable;

    public ToggleSwitch() {
    }

    public ToggleSwitch(ISwitchable iSwitchable) {
        this.iSwitchable = iSwitchable;
    }

    public void setiSwitchable(ISwitchable iSwitchable) {
        this.iSwitchable = iSwitchable;
    }

    @Override
    public void TurnOn() {
        iSwitchable.TurnOn();
    }

    @Override
    public void TurnOff() {
        iSwitchable.TurnOff();
    }

    /**
     * 选择开还是关
     *
     * @param flag True 开  | False 关
     */
    public void Toggle(boolean flag) {
        if (flag) {
            this.TurnOn();

        } else {
            this.TurnOff();
        }
    }
}
/**
 * 具体的电器——灯
 */
public class Light implements ISwitchable {
    @Override
    public void TurnOn() {
        System.out.print("打开灯->");
    }

    @Override
    public void TurnOff() {
        System.out.print("关闭灯->");
    }
}
public class BulbLight extends Light {
    @Override
    public void TurnOn() {
        super.TurnOn();
        System.out.println(this.getClass().getName());
    }

    @Override
    public void TurnOff() {
        super.TurnOff();
        System.out.println(this.getClass().getName());
    }
}
public class TubeLight extends Light {
    @Override
    public void TurnOn() {
        super.TurnOn();
        System.out.println(this.getClass().getName());
    }

    @Override
    public void TurnOff() {
        super.TurnOff();
        System.out.println(this.getClass().getName());
    }
}
/**
 * 具体的电器——电视
 */
public class TV implements ISwitchable {
    @Override
    public void TurnOn() {
        System.out.println("打开电视");
    }

    @Override
    public void TurnOff() {
        System.out.println("关闭电视");
    }
}
public class Main {
    public static void main(String[] args) {
        //三个具体的电器对象
        ISwitchable bulbLight = new BulbLight();
        ISwitchable tubeLight = new TubeLight();
        ISwitchable tv = new TV();
        //开关控制类 可以控制上面三个电器
        ToggleSwitch toggleSwitch = new ToggleSwitch();
        toggleSwitch.setiSwitchable(bulbLight);
        toggleSwitch.Toggle(true);
        toggleSwitch.Toggle(false);
        toggleSwitch.setiSwitchable(tubeLight);
        toggleSwitch.Toggle(true);
        toggleSwitch.Toggle(false);
        toggleSwitch.setiSwitchable(tv);
        toggleSwitch.Toggle(true);
        toggleSwitch.Toggle(false);
    }
}