一、一個對象應該對其餘對象保持最少的瞭解
二、類與類關係越密切,耦合度越大
三、迪米特法則又叫最少知道原則,即一個類對本身依賴的類知道的越少越好。也就是說,對於被依賴的類無論多麼複雜,都儘可能將邏輯封裝在類的內部。對外除了提供public方法,不對外泄露任何信息
四、迪米特法則還有個更簡單的定義:只與直接朋友通訊
五、直接的朋友:每一個對象都會與其餘對象有耦合關係,只要兩個對象只有有耦合關係,咱們就說這兩個對象之間是朋友關係。耦合的方式不少,依賴,關聯,組合,聚合等。其中,咱們稱出現成員變量,方法參數,方法返回值中的類爲直接的朋友,而出如今局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量的形式出如今類的內部。this
public class Demeter1 { public static void main(String[] args) { SchoolManager schoolManager = new SchoolManager(); schoolManager.printAllEmployee(new CollegeManage()); } } //總部員工的類 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 CollegeManage { // 返回學院的全部員工 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 printEmployee() { // 獲取學院員工 List<CollegeEmployee> list1 = this.getAllEmployee(); System.out.println("------學院員工------"); for (CollegeEmployee e : list1) { System.out.println(e.getId()); } } } //管理學校員工的類 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("學校總部員工" + i); list.add(emp); } return list; } void printAllEmployee(CollegeManage sub) { /* * 分析問題 1.這裏的CollegeEmployee 不是 SchoolManager的直接朋友 2.CollegeEmployee * 是以局部變量的方式出如今 SchoolManager 3.違反了迪米特法則 */ /* * 解決辦法 1.將輸出學院的員工方法,轉到CollegeEmployee */ sub.printEmployee(); // 獲取學校總部員工 List<Employee> list2 = this.getAllEmployee(); System.out.println("------學校總部員工------"); for (Employee e : list2) { System.out.println(e.getId()); } } }
上面的代碼,CollegeEmployee 不是 SchoolManager的直接朋友,CollegeEmployee是以局部變量的方式出如今SchoolManager,因此違反了迪米特法則code
public class Demeter1 { public static void main(String[] args) { SchoolManager schoolManager = new SchoolManager(); schoolManager.printAllEmployee(new CollegeManage()); } } //總部員工的類 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 CollegeManage { // 返回學院的全部員工 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("學校總部員工" + i); list.add(emp); } return list; } void printAllEmployee(CollegeManage sub) { // 獲取學院員工 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()); } } }
一、迪米特法則的核心是下降類之間的耦合
二、因爲每一個類都減小了沒必要要的依賴,所以迪米特法則知識要求下降類間(對象間)耦合關係,並非要求徹底沒有依賴關係對象