大话设计模式-依赖倒置原则的最佳实践
依赖倒置原则(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);
}
}