一、介绍
1、迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LoD.
2、一个对象应该对其他对象保持最少了解。
3、类与类的关系越密切耦合度越大
4、与直接对象交换信息、直接朋友。(成员、类内部方法的参数、类方法的返回值)
5、陌生的类最好不要以局部变量的形式出现在类的内部。
6、迪米特法则是降低类与类之间的耦合。
二、代码
1、演示
package com.hao.demo.design.demeter;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author haoxiansheng
* @date 2020-05-12
*/
public class Demeter {
public static void main(String[] args) {
CompanyManager companyManager = new CompanyManager();
companyManager.printAllEmployee(new CollegeManager());
}
}
// 公司总部员工
@Data
class Employee {
private String id;
public Employee(String id) {
this.id = id;
}
}
// 某部门员工
@Data
class CollegeEmployee {
private String id;
public CollegeEmployee(String id) {
this.id = id;
}
}
// 管理类
class CollegeManager {
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
CollegeEmployee collegeEmployee = new CollegeEmployee(i + "");
list.add(collegeEmployee);
}
return list;
}
}
// 公司总部员工
class CompanyManager {
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Employee employee = new Employee(i + "");
list.add(employee);
}
return list;
}
// 违反了迪米特法则 局部变量出现在方法中
public void printAllEmployee(CollegeManager collegeManager) {
// 获取公司某部门员工并输出
List<CollegeEmployee> list = collegeManager.getAllEmployee(); // CollegeEmployee 不是直接朋友
list.forEach(System.out::println);
// 获取总部员工并输出
this.getAllEmployee().forEach(System.out::println);
}
}
2、改进
package com.hao.demo.design.demeter;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author haoxiansheng
* @date 2020-05-12
*/
public class ImproveDemeter {
public static void main(String[] args) {
CompanyManager companyManager = new CompanyManager();
companyManager.printAllEmployee(new CollegeManager());
}
}
// 公司总部员工
@Data
class Employee2 {
private String id;
public Employee2(String id) {
this.id = id;
}
}
// 某部门员工
@Data
class CollegeEmployee2 {
private String id;
public CollegeEmployee2(String id) {
this.id = id;
}
}
// 管理类
class CollegeManager2 {
public List<CollegeEmployee2> getAllEmployee() {
List<CollegeEmployee2> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
CollegeEmployee2 collegeEmployee = new CollegeEmployee2(i + "");
list.add(collegeEmployee);
}
return list;
}
public void printCollegeEmployee2(){
// 获取公司某部门员工并输出
List<CollegeEmployee2> list = this.getAllEmployee(); // CollegeEmployee 不是直接朋友
list.forEach(System.out::println);
}
}
// 公司总部员工
class CompanyManager2 {
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Employee employee = new Employee(i + "");
list.add(employee);
}
return list;
}
// 解决方法
public void printAllEmployee(CollegeManager collegeManager) {
collegeManager.getAllEmployee(); // 我只要输出其他的我不需要知道
// 获取总部员工并输出
this.getAllEmployee().forEach(System.out::println);
}
}