迪米特原則(Law of Demeter , LoD)是指一個對象應該對其它對象保持最少的瞭解,又叫最少知道原則(Least Knowledge Principle,LKP),儘量降低類與類之間的耦合度。迪米特原則主要強度,只和朋友交流,不和陌生人說話。出現在成員變量、方法的輸入、輸出參數中的類都可以稱爲成員朋友類,而出現在方法內部的類不屬於朋友類。
1.比如說,現在有一個權限系統,Boss需要查看目前發佈到線上的課程數量。此時,Boss 要找到 TeamLeader 去進行統計,TeamLeader 把統計結果告訴Boss. 上代碼:
Course 類
public class Course{}
TeamLeader 類
public class TeamLeader{
public void checkNumberOfCourses(List<Course> courseList){
System.out.println("目前已發佈的課程量: "+ courseList.size());
}
}
Boss 類
public class Boss{
public void commandCheckNumber(TeamLeader teamLeader){
//模擬Boss一頁一頁的往下翻,TeamLeader 實時統計
List<Course> courseList = new ArrayList<course>();
for(int i = 0 ; i < 20; i++){
courseList.add(new Course());
}
teamLeader.checkNumberOfCourses(courseList);
}
}
2.測試一下
public static void main(String [] args){
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader ();
boss.commandCheckNumber(teamLeader);
}
根據迪米特原則,從上面代碼可以看出,Boss 類既用了 TeamLeader 類,又用了 Course 類,但是 Boss 類是不需要直接與 Course 類進行交流的,只有TeamLeader 類在進行統計時需要引用 Course 對象。
3.來改造以下代碼
TeamLeader 類
public class TeamLeader{
public void checkNumberOfCourses(){
List<Course> courseList = new ArrayList<course>();
for(int i = 0 ; i < 20; i++){
courseList.add(new Course());
}
System.out.println("目前已發佈的課程量: "+ courseList.size());
}
}
Boss 類
public class Boss{
public void commandCheckNumber(TeamLeader teamLeader){
teamLeader.checkNumberOfCourses();
}
}
通過改造之後的代碼,我們可以看出 Boss 只需要引用 TeamLeader 的對象就行,並且避免與 Course 類的耦合。