迪米特原则
基本介绍
定义:迪米特法则也称为最少知识原则,即一个对象应该对其他对象有最少的了解。通俗地说,一个类应该对自己需要耦合或调用的类知道的最少,被调用或耦合的类的内部是如何复杂都和我没有关系。
一个类只需要知道人家提供多少public方法,我就调用多少,其他的一概不关心。
核心观念-》类间解耦
迪米特法则对类的低耦合提出了明确的要求,包含以下4层含义:
①只和朋友交流:
迪米特法则的另一个解释是:是与直接的朋友通信
朋友关系是什么:每个对象必然会与其他对象有耦合关系,两个对象之间的耦合关系就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖等。
直接朋友是什么?出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类
②朋友之间也是有距离的:
一个类公开的public属性或者方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。所以,在设计时要反复衡量:是否换可以再减少public方法和属性,是否可以修改为private、protected等访问权限,是否可以加上final关键字。
③是自己的就是自己的
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放在本类中
package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;
public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager=new SchoolManager();
schoolManager.printAllEmployee(new CollegeManager());
}
}
/*
* 学校总部员工
* */
class Employee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 学院员工
* */
class CollegeEmployee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 管理学院的员工类
* */
class CollegeManager{
/*
* 返回学院的所有员工
* */
public List<CollegeEmployee> getAllEmployee(){
ArrayList<CollegeEmployee> list=new ArrayList<>();
//模拟10个学院员工
for (int i=0;i<10;i++){
CollegeEmployee collegeEmployee=new CollegeEmployee();
collegeEmployee.setId("学院员工id="+i);
list.add(collegeEmployee);
}
return list;
}
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
/*
* 返回学校总部的所有员工
* */
public List<Employee> getAllEmployee(){
ArrayList<Employee> list=new ArrayList<>();
//模拟10个学院员工
for (int i=0;i<10;i++){
Employee employee=new Employee();
employee.setId("学校总部的员工id="+i);
list.add(employee);
}
return list;
}
public void printAllEmployee(CollegeManager collegeManager){
//打印学校和学院的所有员工
List<CollegeEmployee> list1=collegeManager.getAllEmployee();
System.out.println("============学院员工============");
for (CollegeEmployee collegeEmployee : list1) {
System.out.println(collegeEmployee);
}
List<Employee> list2=this.getAllEmployee();
System.out.println("============学校总部员工============");
for (Employee employee : list2) {
System.out.println(employee);
}
}
}
1、分析SchoolManager的直接朋友:
成员变量、方法参数、方法返回值
Employee、CollegeManager是CollegeEmployee不是成员变量,不是方法参数,不是返回值是以局部变量的方式出现在SchoolManager中
2、总结:问题主要出现在SchoolManager类的printAllEmployee方法中使用了CollegeEmployee类,这里的CollegeEmployee类是非朋友关系,违反了迪米特法则
修改:
package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;
public class Demeter1 {
public static void main(String[] args) {
}
}
/*
* 学校总部员工
* */
class Employee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 学院员工
* */
class CollegeEmployee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 管理学院的员工类
* */
class CollegeManager{
/*
* 返回学院的所有员工
* */
public List<CollegeEmployee> getAllEmployee(){
ArrayList<CollegeEmployee> list=new ArrayList<>();
//模拟10个学院员工
for (int i=0;i<10;i++){
CollegeEmployee collegeEmployee=new CollegeEmployee();
collegeEmployee.setId("学院员工id="+i);
list.add(collegeEmployee);
}
return list;
}
/**
* 将原来在SchoolManager中的代码提取到自己类中
*/
public void printEmployee(){
List<CollegeEmployee> list1=this.getAllEmployee();
System.out.println("============学院员工============");
for (CollegeEmployee collegeEmployee : list1) {
System.out.println(collegeEmployee);
}
}
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
/*
* 返回学校总部的所有员工
* */
public List<Employee> getAllEmploypackage com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;
public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager=new SchoolManager();
schoolManager.printAllEmployee(new CollegeManager());
}
}
/*
* 学校总部员工
* */
class Employee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 学院员工
* */
class CollegeEmployee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
* 管理学院的员工类
* */
class CollegeManager{
/*
* 返回学院的所有员工
* */
public List<CollegeEmployee> getAllEmployee(){
ArrayList<CollegeEmployee> list=new ArrayList<>();
//模拟10个学院员工
for (int i=0;i<10;i++){
CollegeEmployee collegeEmployee=new CollegeEmployee();
collegeEmployee.setId("学院员工id="+i);
list.add(collegeEmployee);
}
return list;
}
/**
* 将原来在SchoolManager中的代码提取到自己类中
*/
public void printEmployee(){
List<CollegeEmployee> list1=this.getAllEmployee();
System.out.println("============学院员工============");
for (CollegeEmployee collegeEmployee : list1) {
System.out.println(collegeEmployee);
}
}
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
/*
* 返回学校总部的所有员工
* */
public List<Employee> getAllEmployee(){
ArrayList<Employee> list=new ArrayList<>();
//模拟10个学院员工
for (int i=0;i<10;i++){
Employee employee=new Employee();
employee.setId("学校总部的员工id="+i);
list.add(employee);
}
return list;
}
public void printAllEmployee(CollegeManager collegeManager){
//打印学校和学院的所有员工
collegeManager.printEmployee();
List<Employee> list2=this.getAllEmployee();
System.out.println("============学校总部员工============");
for (Employee employee : list2) {
System.out.println(employee);
}
}
}