基本介紹 1、一個對象應該對其他對象保持最少的瞭解 2、類與類關係越密切,耦合度越大 3、迪米特法則又叫 最少知道原則 ,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供public方法,不對外泄露任何信息 4、迪米特法則還有個更簡 ...
基本介紹
1、一個對象應該對其他對象保持最少的瞭解
2、類與類關係越密切,耦合度越大
3、迪米特法則又叫最少知道原則,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供public方法,不對外泄露任何信息
4、迪米特法則還有個更簡單的定義:只與直接朋友通信
5、直接的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象只有有耦合關係,我們就說這兩個對象之間是朋友關係。耦合的方式很多,依賴,關聯,組合,聚合等。其中,我們稱出現成員變數,方法參數,方法返回值中的類為直接的朋友,而出現在局部變數中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變數的形式出現在類的內部。
案例分析
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,所以違反了迪米特法則
改進代碼
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());
}
}
}
迪米特法則應註意的事項和細節
1、迪米特法則的核心是降低類之間的耦合
2、由於每個類都減少了不必要的依賴,因此迪米特法則知識要求降低類間(對象間)耦合關係,並不是要求完全沒有依賴關係