核心思想:降低类之间的耦合。
来看一个类之间耦合度很高的实例
public class Demeter {
public static void main(String agrs[]) {
ScholleManager scholleManager = new ScholleManager();
CollegeManager CollegeManager = new CollegeManager();
scholleManager.printAllEmployee(CollegeManager);
}
}
//学校员工
@Data
class ScholleEmployee {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
//学校员工
@Data
class CollegeEmployee {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
//管理学院员工
class CollegeManager {
//全院所有员工
List<CollegeEmployee> getCollegeEmployee() {
List<CollegeEmployee> collegeEmployeeList = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId(i);
collegeEmployeeList.add(collegeEmployee);
}
return collegeEmployeeList;
}
}
//学校员工
class ScholleManager {
//全校所有员工
List<ScholleEmployee> getScholleEmployee() {
List<ScholleEmployee> scholleEmployeeList = new ArrayList<ScholleEmployee>();
for (int i = 0; i < 10; i++) {
ScholleEmployee scholleEmployee = new ScholleEmployee();
scholleEmployee.setId(i);
scholleEmployeeList.add(scholleEmployee);
}
return scholleEmployeeList;
}
//输出全部员工
void printAllEmployee(CollegeManager collegeManager) {
//将输出学院的方法封装到,CollegeManager中
List<CollegeEmployee> collegeEmployeeList = collegeManager.getCollegeEmployee();
System.out.println("--------学院员工-------");
for (CollegeEmployee collegeEmployee : collegeEmployeeList
) {
System.out.println("学院员工=" + collegeEmployee.getId());
}
List<ScholleEmployee> scholleEmployeeList = this.getScholleEmployee();
System.out.println("--------学校员工-------");
for (ScholleEmployee scholleEmployee : scholleEmployeeList
) {
System.out.println("学校员工=" + scholleEmployee.getId());
}
}
}
运行结果:
--------学院员工-------
学院员工=0
学院员工=1
学院员工=2
学院员工=3
学院员工=4
学院员工=5
学院员工=6
学院员工=7
学院员工=8
学院员工=9
--------学校员工-------
学校员工=0
学校员工=1
学校员工=2
学校员工=3
学校员工=4
学校员工=5
学校员工=6
学校员工=7
学校员工=8
学校员工=9
分析:输出员工时,院管理类的引用作为参数,调用了后去院员工的方法。同时进行了遍历输出。对于学校管理类来说,院管理类就是一个陌生类。他的引用增加了类之间的耦合。
解决思路:院的员工输出方法放在院管理类中。
public class DemeterImp {
public static void main(String agrs[]) {
ScholleManager scholleManager = new ScholleManager();
CollegeManager CollegeManager = new CollegeManager();
scholleManager.printAllEmployee(CollegeManager);
}
}
//学校员工
@Data
class ScholleEmployeeImp {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
//学校员工
@Data
class CollegeEmployeeImp {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
//管理学院员工
class CollegeManagerImp {
//全院所有员工
List<CollegeEmployee> getCollegeEmployee() {
List<CollegeEmployee> collegeEmployeeList = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId(i);
collegeEmployeeList.add(collegeEmployee);
}
return collegeEmployeeList;
}
void printCollegeManager()
{
List<CollegeEmployee> collegeEmployeeList = this.getCollegeEmployee();
System.out.println("--------学院员工-------");
for (CollegeEmployee collegeEmployee : collegeEmployeeList
) {
System.out.println("学院员工=" + collegeEmployee.getId());
}
}
}
//学校员工
class ScholleManagerImp {
//全校所有员工
List<ScholleEmployee> getScholleEmployee() {
List<ScholleEmployee> scholleEmployeeList = new ArrayList<ScholleEmployee>();
for (int i = 0; i < 10; i++) {
ScholleEmployee scholleEmployee = new ScholleEmployee();
scholleEmployee.setId(i);
scholleEmployeeList.add(scholleEmployee);
}
return scholleEmployeeList;
}
//输出全部员工
void printAllEmployee(CollegeManagerImp collegeManager) {
//将输出学院的方法封装到,CollegeManager中
collegeManager.printCollegeManager();
List<ScholleEmployee> scholleEmployeeList = this.getScholleEmployee();
System.out.println("--------学校员工-------");
for (ScholleEmployee scholleEmployee : scholleEmployeeList
) {
System.out.println("学校员工=" + scholleEmployee.getId());
}
}
}
总结:一个对象应该对其他对象保持最少的了解。
类与类关系越密切,耦合度越大。
只和直接朋友通信。直接朋友指出现成员变量,方法参数,方法返回值中的类。
出现在局部变量中的类不是直接的朋友。