定义
- 一个对象应该对其他对象有最少的了解。
- 如果一个方法放在本类中,即不增加类间关系,也对本类不产生负面影响,那就放到本类中。
- 尽量不要对外公开太多的public方法和非静态的public变量,尽量内敛,多使用private,package-private,protected等访问权限。
- Only talk to your immediate friends(只与直接朋友通信):出现在成员变量,方法的输入输出参数中的类,称为朋友类
代码理解
场景
假设一个IT公司的老总(BOSS),要求项目经理(ProjectManager)汇报一下目前正在开发的所有项目(Project)。我们用JAVA来实现一下。
错误实现
1.创建BOSS类,来要求项目经理汇报项目
package com.principle.demeter.wrong;
import com.principle.demeter.Project;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName Boss
* @Description BOSS类
* @Author Neal
* @Date 2019/3/1 15:46
* @Version 1.0
*/
public class Boss {
/**
* 让项目经理汇报项目
* @param projectManager 项目经理
*/
public void showMeProject(ProjectManager projectManager) {
//直接模拟有5个项目
List<Project> projects = new ArrayList<Project>(5);
projectManager.showProject(projects);
}
}
2.创建ProjectManager类,来汇报项目
package com.principle.demeter.wrong;
import com.principle.demeter.Project;
import java.util.List;
/**
* @ClassName ProjectManager
* @Description 项目经理类
* @Author Neal
* @Date 2019/3/1 15:47
* @Version 1.0
*/
public class ProjectManager {
/**
* 展示项目
* @param projects
*/
public void showProject(List<Project> projects) {
for(Project project : projects) {
System.out.println("每个项目的内容是 : " + project);
}
}
}
3.项目类 (Project)
package com.principle.demeter;
/**
* @ClassName Project
* @Description 项目类
* @Author Neal
* @Date 2019/3/1 15:47
* @Version 1.0
*/
public class Project {
}
我们来看一下类图。

S类 还是ProjectManager类 都依赖了Project。但是我们仔细来看BOSS类发现,Project并不是BOSS的朋友(出现在成员变量,方法的输入输出参数中的类,称为朋友类)。因此Project不应该出现在BOSS类中。这就违背了迪米特法则。
还有一种方法也可以看出,大家可能注意到了,我在代码中把引用也展示了出来,因此我们也可以来看BOSS的引用判断,我们可以看到 import com.principle.demeter.Project;
的引用并没有出现在BOSS类的成员变量,方法输入或者返回输出。 这也是判断迪米特法则的一种方式。
既然已经了解的迪米特法则,那么我们正确实现就很easy了。
正确实现
1.修改BOSS类,将Project相关移除。
package com.principle.demeter.right;
/**
* @ClassName Boss
* @Description BOSS类
* @Author Neal
* @Date 2019/3/1 15:46
* @Version 1.0
*/
public class Boss {
/**
* 让项目经理汇报项目
* @param projectManager 项目经理
*/
public void showMeProject(ProjectManager projectManager) {
projectManager.showProject();
}
}
2.修改ProjectManager类,使其符合BOSS类的调用。
package com.principle.demeter.right;
import com.principle.demeter.Project;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ProjectManager
* @Description 项目经理类
* @Author Neal
* @Date 2019/3/1 15:47
* @Version 1.0
*/
public class ProjectManager {
/**
* 展示项目
*/
public void showProject() {
//直接模拟有5个项目
List<Project> projects = new ArrayList<Project>(5);
for(Project project : projects) {
System.out.println("每个项目的内容是 : " + project);
}
}
}
我们可以通过引用(import
)可以发现,BOSS类完全移除了Project 类。而ProjectManager 与 Project 建立了正确的朋友关系。
我们再来看一下类图。

是不是很清晰呢?
总结
迪米特法则其实很简单,只需要区分哪些是真正的朋友,这样在写程序的过程中,适当的运用迪米特法则,降低类之间的耦合。
网友评论