迪米特法则
- 一 官方定义
- 基本介绍
- 二 案例演示
- 普通实现方式
- 案例分析
- 迪米特法则方式
- 三 注意事项
一 官方定义
迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least KnowledgePrinciple, LKP)
One object should have a minimum understanding of other objects
(一个对象应该对其他对象有最少的了解 )
Only talk to your immediate friends ( 只与直接的朋友通信)
基本介绍
什么是一个对象应该对其他对象有最少的了解?
换句话说,对于被依赖的类,不管多么复杂都应该将逻辑封装在类的内部,对外只提供公共的public方法,不对外泄露任何其他的信息。
什么是只与直接的朋友通信?
朋友关系: 只要两个对象有依赖关系那他们两个就是朋友关系
直接的朋友:
- 成员变量
也就是说一个类以成员变量的形式出现在另一个类内部的那么这两个类互为直接的朋友
- 方法的参数类型
也就是说一个类的方法接收的参数类型是另一个类的类型那么这两个类互为直接的朋友
- 方法的返回值类型
也就是说一个方法中接收的返回值类型是另一个类的类型那么这两个类互为直接的朋友
比如说在方法内部使用到的,比如说这个类以局部变量的形式出现的,这种情况下他们就不是直接的朋友关系。
二 案例演示
需求:有一个学校,下属有各个学院和总部,现要求打印出总部员工的ID和学院员工的ID
普通实现方式
SchoolEmployee 总部员工的基类
//总部员工的基类
public class SchoolEmployee {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
CollegeEmployee 学院员工的基类
//学院员工的基类
public class CollegeEmployee {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
SchoolManager 总部管理类
import java.util.ArrayList;
import java.util.List;
//总部管理类
public class SchoolManager {
//获取总部员工的方法
public List<SchoolEmployee> getSchoolEmployee() {
ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();
for (int i = 0; i < 5; i++) {
SchoolEmployee schoolEmployee = new SchoolEmployee();
schoolEmployee.setId("总部员工 ,id是" + i);
schoolEmployees.add(schoolEmployee);
}
return schoolEmployees;
}
//打印方法
public void printAllEmployee(CollegeManager collegeManager) {
//打印总部的学院员工
List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();
for (SchoolEmployee employee : schoolEmployee) {
System.out.println(employee.getId());
}
System.out.println("------------------");
//打印学院员工的操作
List<CollegeEmployee> collegeEmployee = collegeManager.getCollegeEmployee();
for (CollegeEmployee employee : collegeEmployee) {
System.out.println(employee.getId());
}
}
}
CollegeManager 学院的管理类
import java.util.ArrayList;
import java.util.List;
//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {
public List<CollegeEmployee> getCollegeEmployee(){
ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();
for (int i = 0; i < 10; i++) {
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId("学院员工,id是" + i);
collegeEmployees.add(collegeEmployee);
}
return collegeEmployees;
}
}
//案例演示 - 迪米特法则
//客户端的角色
//需求:有一个学校,下属有各个学院和总部,现要求打印出总部员工的ID和学院员工的ID
public class DemeterDemo {
public static void main(String[] args) {
new SchoolManager().printAllEmployee(new CollegeManager());
}
}
案例分析
迪米特法则说道只与直接的朋友通信。
我们分析一下SchoolManager总部管理类。
迪米特法则方式
SchoolManager 总部管理类
public class SchoolManager {
//获取总部员工的方法
public List<SchoolEmployee> getSchoolEmployee(){
ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();
for (int i = 0; i < 5; i++) {
SchoolEmployee schoolEmployee = new SchoolEmployee();
schoolEmployee.setId("总部员工 ,id是" + i);
schoolEmployees.add(schoolEmployee);
}
return schoolEmployees;
}
//打印方法
public void printAllEmployee(CollegeManager collegeManager){
//打印总部的学院员工
List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();
for (SchoolEmployee employee : schoolEmployee) {
System.out.println(employee.getId());
}
System.out.println("------------------");
//打印学院员工的操作
collegeManager.printCollegeEmployee();
}
}
CollegeManager 学院的管理类
//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {
public List<CollegeEmployee> getCollegeEmployee(){
ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();
for (int i = 0; i < 10; i++) {
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId("学院员工,id是" + i);
collegeEmployees.add(collegeEmployee);
}
return collegeEmployees;
}
//打印学院员工的方法
public void printCollegeEmployee(){
List<CollegeEmployee> collegeEmployee = getCollegeEmployee();
for (CollegeEmployee employee : collegeEmployee) {
System.out.println(employee.getId());
}
}
}
三 注意事项
- 迪米特法则的核心是降低类之间的耦合
- 从被依赖者的角度来说,尽量将逻辑封装在类的内部,对外除了提供的public方法,不泄露任何信息
- 从依赖者的角度来说,只依赖应该依赖的对象
- 切忌不要为了用而用