迪米特法则(Law of Demeter,LOD)是指一个对象应该对其它对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特法则主要强调只有朋友交流,不和陌生人说话。出现在成员变量,方法的输入,输出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。
现在来设计一个权限系统,Boss需要查看目前发布到线上的课程数量。这个时候,Boss需要找到TeamLeader进行统计,TeamLeader再把统计结果告诉Boss。接下来我们还是来看代码:
Course类:

package com.framework.demeter;

public class Course {
}

TeamLeader类:

package com.framework.demeter;

import java.util.List;

public class TeamLeader {
    public void CheckNumberOfCourses(List<Course> courseList) {
        System.out.println("目前已发布的课程数量是:" + courseList.size());
    }
}

Boss类:

package com.framework.demeter;

import java.util.ArrayList;
import java.util.List;

public class Boss {
    public void commandCheckNumber(TeamLeader teamLeader) {
        //模拟Boss一页一页往下翻页,TeamLeader实时统计
        List<Course> courseList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            courseList.add(new Course());
        }
        teamLeader.CheckNumberOfCourses(courseList);
    }
}

测试代码:

package com.framework.demeter;

public class UnitTest {
    public static void main(String[] args) {
        Boss boss = new Boss();
        TeamLeader teamLeader = new TeamLeader();
        boss.commandCheckNumber(teamLeader);
    }
}

写到这里,其实功能都已经实现了,代码看上去也没有什么问题。根据迪米特法则,Boss只想要结果,不需要跟Course产生直接的交流。而TeamLeader统计需要引用Course对象。Boss和Course并不是好朋友,从下面的类图就可以看出来:
微信截图_20200825163012.png
下面来对代码进行改造:
TeamLeader类:

package com.framework.demeter;

import java.util.ArrayList;
import java.util.List;

public class TeamLeader {
    public void CheckNumberOfCourses() {
        List<Course> courseList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            courseList.add(new Course());
        }
        System.out.println("目前已发布的课程数量是:" + courseList.size());
    }
}

Boss类:

package com.framework.demeter;

import java.util.ArrayList;
import java.util.List;

public class Boss {
    public void commandCheckNumber(TeamLeader teamLeader) {
        teamLeader.CheckNumberOfCourses();
    }
}

再来看下面的类图,Course和Boss已经没有关联了:
微信截图_20200825163647.png