基本介绍
1) 一个对象应该对其他对象保持最少的了
2) 类与类关系越密切,耦合度越大
3) 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的
越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内
部。对外除了提供的public 方法,不对外泄露任何信息
4) 迪米特法则还有个更简单的定义:只与直接的朋友通信
5) **直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系
我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合
等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而
出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量
的形式出现在类的内部。**
1.错误示范
对于SchoolManager学校管理类
分析:
直接朋友:Employee ,CollegeManager
陌生朋友:CollegeEmployee,不是直接朋友,局部变量的方式出SchoolManager,是陌生类,违反迪米特法则
package com.kris.designmode.principle.demeter;import java.util.ArrayList;import java.util.List;public class Demeter1 {public static void main(String[] args) {//创建一个SchoolManager对象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(){List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();for (int i=0;i<10;i++){CollegeEmployee employee = new CollegeEmployee();employee.setId("学院员工id="+i);list.add(employee);}return list;}}/*** SchoolManager学校管理类* 分析:* 直接朋友:Employee ,CollegeManager* 陌生朋友:CollegeEmployee,不是直接朋友,局部变量的方式出SchoolManager,是陌生类,违反迪米特法则*/class SchoolManager{/*** 返回学校总部所有员工* @return*/public List<Employee> getAllEmployee(){List<Employee> list = new ArrayList<Employee>();for (int i=0;i<10;i++){Employee employee = new Employee();employee.setId("学校总部员工id="+i);list.add(employee);}return list;}/*** 打印学院和学校所有的员工id* @param collegeManager*/void printAllEmployee(CollegeManager collegeManager){List<CollegeEmployee> allCollegeEmployee = collegeManager.getAllEmployee();System.out.println("---------学院员工-----------");for (CollegeEmployee employee : allCollegeEmployee) {System.out.println(employee.getId());}System.out.println("---------学校员工-----------");List<Employee> allSchoolEmployee = this.getAllEmployee();for (Employee employee : allSchoolEmployee) {System.out.println(employee.getId());}}}
2.正确示范
应用实例改进
1) 前面设计的问题在于SchoolManager中,CollegeEmployee类并不是
SchoolManager类的直接朋友 (分析)
2) 按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合
3) 对代码按照迪米特法则 进行改进,将本来的打印学院员工的部分,放到CollegeManager类中实现
package com.kris.designmode.principle.demeter.improve;import java.util.ArrayList;import java.util.List;public class Demeter1 {public static void main(String[] args) {//创建一个SchoolManager对象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(){List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();for (int i=0;i<10;i++){CollegeEmployee employee = new CollegeEmployee();employee.setId("学院员工id="+i);list.add(employee);}return list;}/*** 打印学院的员工id*/void printAllEmployee(){List<CollegeEmployee> allCollegeEmployee = getAllEmployee();System.out.println("---------学院员工-----------");for (CollegeEmployee employee : allCollegeEmployee) {System.out.println(employee.getId());}}}/*** 学校管理类* 分析:* 直接朋友:Employee ,CollegeManager* 陌生朋友:CollegeEmployee,不是直接朋友,局部变量的方式出SchoolManager,是陌生类,违反迪米特法则*/class SchoolManager{/*** 返回学校总部所有员工* @return*/public List<Employee> getAllEmployee(){List<Employee> list = new ArrayList<Employee>();for (int i=0;i<10;i++){Employee employee = new Employee();employee.setId("学校总部员工id="+i);list.add(employee);}return list;}/*** 学校所有的员工id* @param collegeManager*/void printAllEmployee(CollegeManager collegeManager){//将本来的打印学院员工的部分,放到CollegeManager类中实现collegeManager.printAllEmployee();System.out.println("---------学校员工-----------");List<Employee> allSchoolEmployee = this.getAllEmployee();for (Employee employee : allSchoolEmployee) {System.out.println(employee.getId());}}}
3.迪米特法则注意事项和细节
1) 迪米特法则的核心是降低类之间的耦合
2) 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低
类间(对象间)耦合关系, 并不是要求完全没有依赖关系
