迪米特法则

定义

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least Knowledge Principle, LKP)。

意义

迪米特法则的意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

值得一提的是,这一法则却不仅仅局限于计算机领域,在其他领域也同样适用。比如,美国人就在航天系统的设计中采用这一法则。


实践

1.只和直接的朋友交流;2.减少对朋友的了解。下面就详细说说如何做到这两点。

我们举一个例子说明什么是朋友,什么是直接的朋友。很简单的例子:老师让班长清点全班同学的人数。这个例子中总共有三个类:老师Teacher、班长ClassLeader和学生Student

package demitDemo;

import java.util.ArrayList;


public class Teacher {//教师类
    public void command(ClassLeader classleader) {
        
        ArrayList<String> list = new ArrayList<>();
        
        for(int i=0;i<40;i++) {
            Student student = new Student();
            student.setName("学生"+i);
            list.add(student.getName());
            
        }
        ClassLeader.order(list);
        
    }

}
package demitDemo;

import java.util.ArrayList;

public class ClassLeader {//班长类
    public static void order(ArrayList<String> getAllName) {
        for(int i=0;i<40;i++) {
            System.out.println(getAllName.get(i));
            
        }
    }

}
package demitDemo;

public class Student {//学生类
    private String name;
    public void setName(String name) {
        
        this.name = name;
        }
    public String getName() {
        return name;
    }

}
package demitDemo;

public class Client {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        ClassLeader classleader = new ClassLeader();
        teacher.command(classleader);
    }

}

在这个例子中,我们的Teacher有几个朋友?两个,一个是GroupLeader,因为它是Teachercommand:方法的输入参数;另一个是Student,因为在Teachercommand:方法体中使用了Student

那么我们的Teacher有几个是直接的朋友?按照直接的朋友的定义“出现在成员变量、方法的输入输出参数中的类就是直接的朋友”,只有GroupLeaderTeacher的直接的朋友。Teachercommand方法中创建了

Student的集合,和非直接的朋友Student发生了交流,所以,上述例子违反了迪米特法则。方法是类的一个行为,类竟然不知道自己的行为与其他的类产生了依赖关系,这是不允许的,严重违反了迪米特法则!

为了使上述例子符合迪米特法则,我们可以做如下修改:
package demitDemo;

import java.util.ArrayList;

public class ClassLeader {//班长类
    public static void order() {
        
        ArrayList<String> getAllName = new ArrayList<>();
        
        for(int i=0;i<40;i++) {
            Student student = new Student();
            student.setName("学生"+i);
            getAllName.add(student.getName());
            
        }
        for(int j=0;j<40;j++) {
            System.out.println(getAllName.get(j));
            
        }
    }

}
package demitDemo;

import java.util.ArrayList;


public class Teacher {

//教师类
    public void command(ClassLeader classleader) {
        
        classleader.order();
        
    }

}

这样修改后,每个类都只和直接的朋友交流,有效减少了类之间的耦合。

迪米特法则的核心观念就是类间解耦,弱耦合。只有弱耦合了之后,类的复用才可以提高,类变更的风险才可以减低。但解耦是有限度的,除非是计算机的最小单元--二进制的0和1,否则都是存在耦合的。所以在实际项目中,需要适度地参考这个原则,避免过犹不及。




posted @ 2020-03-25 13:15  tang_lei  阅读(333)  评论(0)    收藏  举报