迪米特原则
一个对象应该对其他对象保持最少的了解对外除了提供public方法,不对外透露任何信息 只与'朋友'通信
目的:降低代码耦合度
首先,什么是朋友?
两对象之间有耦合关系就是朋友
什么情况不是朋友?
如果一个对象在另一个对象的局部变量中, 如:在一个类中方法里又new了一个对象,那么这样两个类之间不是朋友关系 所以陌生类最好不要出现在局部变量中
举个简单例子:
class Employee {
private String id;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
class CollegeEmployee {
private String id;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
class CollegeManager {
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id= " + i);
list.add(emp);
}
return list;
}
}
class SchoolManager {
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工id= " + i);
list.add(emp);
}
return list;
}
void printAllEmployee(CollegeManager sub) {
// CollegeEmployee不是SchoolManager的直接朋友,而是以局部变量的形式,出现在SchoolManager中
List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("------------分公司员工------------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
List<Employee> list2 = this.getAllEmployee();
System.out.println("------------学校总部员工------------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}
在上诉代码中,SchoolManage类中printAllEmployee中有CollegeEmployee对象,虽然这可以有但耦合度太大
为了满足迪米特原则,对代码进行改进:
问题代码出现在printAllEmployee中,将其打印分公司员工的方法封装到分公司员工类CollegeManager中即可。
//改进
//将输出分公司员工信息的方法封装到CollegeManager 中
class SchoolManager2 {
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工id= " + i);
list.add(emp);
}
return list;
}
void printAllEmployee(CollegeManager2 sub) {
sub.printCollegeEmployee();
List<Employee> list2 = this.getAllEmployee();
System.out.println("------------学校总部员工------------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}
class CollegeManager2 {
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id= " + i);
list.add(emp);
}
return list;
}
public void printCollegeEmployee() {
List<CollegeEmployee> list1 = getAllEmployee();
System.out.println("------------分公司员工------------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
}
}