定义
- 一个对象应该对其他对象保持最少的了解。
狭义的迪米特法则:
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一类的某一个方法的话,可以通过第三者转发这个调用。
广义的迪米特法则:
一个模块设计的好坏的一个重要标志就是该模块在多大程度上讲自己的内部数据与实现的有关细节隐藏起来。
一个软件实体应当尽可能少的与其他实体发生相互作用。
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则的目的在于降低类与类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,是的相互间存在尽可能少的依赖关系。
在运用迪米特法则到系统的设计中时,要注意以下几点:
第一:在类的划分上,应当创建弱耦合的类,类与类之间的耦合越弱,就越有利于实现可复用的目标。
第二:在类的结构设计上,每个类都应该降低成员的访问权限。
第三:在类的设计上,只要有可能,一个类应当设计成不变的类。
第四:在对其他类的应用上,一个对象对其他类的对象的应用应该降到最低。
第五:尽量限制局部变量的有效范围。
其他解释:
2. 尽量降低类间的耦合
3. 强调之和朋友交流,不和陌生人说话
(朋友: 出现在成员变量,成员方法的参数中,成员方法的返回值中的其他类,称为成员朋友类;而出现在方法体内部的类,不属于朋友类)
优点
降低类之间的耦合性,提高代码的复用性
例子
场景:
老板: 想要知道团队中的项目进度
团队领导:告诉老板进度
项目:包含进度信息
public class Test {
public static void main(String[] args) {
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader();
boss.commandTeamLeader(teamLeader);
}
}
class Boss{
void commandTeamLeader(TeamLeader teamLeader) {
teamLeader.sayProccess(new Program());
}
}
class TeamLeader{
void sayProccess(Program program) {
program.getProccess();
}
}
class Program{
void getProccess() {
System.out.println("当前的项目进度为 50%");
}
}
我们发现,Boss类创建了Program类,但是Program对于Boss来说不是朋友关系,不应该产生直接的关系,项目对于老板老说是不可见的,但是对于teamLeader是可见的的,所以修改代码
public class Demo {
public static void main(String[] args) {
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader();
boss.commandTeamLeader(teamLeader);
}
}
class Boss{
void commandTeamLeader(TeamLeader teamLeader) {
// teamLeader.sayProccess(new Program());
teamLeader.sayProccess();
}
}
class TeamLeader{
//void sayProccess(Program program) {
// program.getProccess();
//}
void sayProccess() {
new Program().getProccess();
}
}
class Program{
void getProccess() {
System.out.println("当前的项目进度为 50%");
}
}
准寻了,迪米特原则,完毕
注意
但是过度使用迪米特法则,也会造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等缺点。同时,因为迪米特法则要求类与类之间尽量不直接通信,如果类之间需要通信就通过第三方转发的方式,这就直接导致了系统中存在大量的中介类,这些类存在的唯一原因是为了传递类与类之间的相互调用关系,这就毫无疑问的增加了系统的复杂度。