概述
定义:一个类对于其他类知道的越少越好,一个对象应当对其他对象有尽可能少的了解
从迪米特法则的定义和特点可知,它强调以下两点:
- 从依赖者的角度来说,只依赖应该依赖的对象。
- 从被依赖者的角度说,只暴露应该暴露的方法。
案例演示
计算机关机案例:当我们点击计算机关机按钮的时候,计算机会执行一系列的动作,比如:保存当前未完成的任务,关闭相关的服务,接着关闭显示屏,关闭电源,这些都完成后,计算机正式关闭。
违反迪米特法则的实现
Computer类:
public 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("断电");
}
}
Person类
public class Person {
private Computer computer = new Computer();
public void shutdownComputer() {
computer.saveData();
computer.killProcess();
computer.killProcess();
computer.powerOff();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.shutdownComputer();
}
}
代码中的问题:Person类对Computer类知道的太多了,计算机关机流程不应该由Person来指定,实际上也不是由Person来指定的,否则可能会因为调用顺序不当造成数据丢失。Computer类中应该只对外提供一个公共的关机方法,至于保存数据、关闭程序、关闭屏幕等方法应该设为私有的并由公共的关机方法来调用,外界不能访问。
遵循迪米特法则的改进方案
Computer类:
public 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() {
saveData();
killProcess();
killProcess();
powerOff();
}
}
Person类:
public class Person {
private Computer computer = new Computer();
public void shutdownComputer() {
computer.shutdown();
}
}
在运用迪米特法则时要注意:
- 在类的设计上,应该创建弱耦合的类;考虑是否可以加上
final
关键字设置成不变类 - 在类的结构设计上,尽量降低类成员的访问权限。
- 在对其他类的引用上,将对其他对象的引用次数降到最低。
- 不暴露类的属性成员,而应该提供相应的get、set方法