迪米特法则
迪米特法则
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);
}
}

浙公网安备 33010602011771号