Demeter Principle
一个对象应该对其他对象保持最少的了解
类与类关系越密切,耦合度越大
迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的 越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息
迪米特法则还有个更简单的定义:只与直接的朋友通信
迪米特法则的核心是降低类之间的耦合
但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低 类间(对象间)耦合关系, 并不是要求完全没有依赖关系
package com.xin.principle;
import java.util.ArrayList;
import java.util.List;
//迪米特法则
public class DiMit {
public static void main(String[] args) {
//获取腾讯所有员工的id
TencentEmpManager tencentEmpManager = new TencentEmpManager();
tencentEmpManager.printAllEmp(new QQEmpManager());
}
}
//腾讯员工类
class TencentEmp {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "TencentEmp{" +
"id=" + id +
‘}‘;
}
}
//qq员工类
class QQEmp {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "QQEmp{" +
"id=" + id +
‘}‘;
}
}
//腾讯员工管理类
/*
对于这一个类来说,它的直接朋友是,TencentEmp,qqEmpManager
*/
class TencentEmpManager {
//获取到员工
public List<TencentEmp> getTencentEmp() {
List<TencentEmp> list = new ArrayList<TencentEmp>();
for (int i = 0; i < 5; i++) {
TencentEmp emp = new TencentEmp();
emp.setId(i);
list.add(emp);
}
return list;
}
//打印出所有员工的方法
void printAllEmp(QQEmpManager qqEmpManager) {
//打印腾讯的员工
List<TencentEmp> tencentEmps = this.getTencentEmp();
tencentEmps.stream().forEach(System.out::println);
//打印qq的员工
/*
迪米特法则:要求只与直接朋友腾讯,而在这一个类中QQEmp不是直接朋友,而是一个陌生的类
所以这里违背了迪米特法则
*/
// List<QQEmp> qqEmps = qqEmpManager.getQQEmp();
// qqEmps.stream().forEach(System.out::println);
//为了满足迪米特法则,这里获取qq员工的id,使用qq员工管理方法提供的方法来获取
qqEmpManager.printQQ();
}
}
//qq员工管理类
class QQEmpManager {
//获取到员工
public List<QQEmp> getQQEmp() {
List<QQEmp> list = new ArrayList<QQEmp>();
for (int i = 0; i < 3; i++) {
QQEmp qqEmp = new QQEmp();
qqEmp.setId(i);
list.add(qqEmp);
}
return list;
}
//打印qq员工id的方法
/*
满足迪米特法则的规范
对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息
*/
public void printQQ() {
List<QQEmp> qqEmps = this.getQQEmp();
qqEmps.stream().forEach(System.out::println);
}
}
原文:https://www.cnblogs.com/allure-xiaoxin/p/14774609.html