不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。迪米特法则是希望减少类之间的耦合,让类越独立越好。每个类都应该少了解系统的其他部分。一旦发生变化,需要了解这一变化的类就会比较少。一个软件实体应当尽可能少地与其他实体发生相互作用。
对于其他的类知道的越少越好(字段、方法参数、方法返回值、方法中实力出的对象等)。
class Computer {
public void saveData() {
System.out.println("保存数据");
}
public void killProcess() {
System.out.println("关闭程序");
}
public void closeScreen() {
System.out.println("关闭屏幕");
}
public void poweroff() {
System.out.println("断电");
}
}
class Person {
private Computer c = new Computer();
public void shutdownComputer() {
c.saveData();
c.killProcess();
c.closeScreen();
c.poweroff();
}
}
上述代码中Person对Computer的细节知道的太多了。
对于Person而言,只需要知道,关机按钮在哪就行,不需要知道如果保存数据,如果关闭进程,如何断电等等细节…
这样的话,代码的复杂度就提升了。 如果用户使用不当,就可以造成更大的损失。例如: 不小心先断电,而没有保存数据,会造成损失。
对上述代码进行改造使之符合迪米特法则:把细节都封装起来了,只需要对外提供一个方法,调用方只需要调用这一个方法就可以了并且不需要担心出现问题。
class Computer {
private void saveData() {
System.out.println("保存数据");
}
private void killProcess() {
System.out.println("关闭程序");
}
private void closeScreen() {
System.out.println("关闭屏幕");
}
private void poweroff() {
System.out.println("断电");
}
public void shutDown() {
this.saveData();
this.killProcess();
this.closeScreen();
this.poweroff();
}
}
class Person {
private Computer c = new Computer();
public void shutdownComputer() {
c.shutDown();
}
}