迪米特原則(Law of Demeter LoD)是指一個對象應該對其他對象保持最少的了解,又叫最少知道原則(Least Knowledge Principle,LKP),盡量降低類與類之間的耦合度。迪米特原則主要強調:只和朋友交流,不和陌生人說話。出現在成員變量、方法的輸入、輸出參數中的類都可以稱為成員朋友類,而出現在方法體內部的類不屬於朋友類。
現在來設計一個權限系統,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);
}
}
測試代碼如下:
public static void main(String[] args) {
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader();
boss.commandCheckNumber(teamLeader);
}
寫到這里,其實功能都已經實現,代碼看上去也沒什么問題。根據迪米特原則,Boss只想要結果,不需要跟Course直接交流。而TeamLeader統計需要引用Course對象。Boss和Course並不是朋友,從下面的類圖就可以看出來。
下面對代碼進行改造。
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();
}
}
再來看下面的類圖,Course和Boss已經沒有關聯了。
學習軟件設計原則,千萬不能形成強迫症。碰到業務復雜的場景,我們需要隨機應變。
關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。
本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!
其他設計原則
Tom彈架構:開閉原則(Open-Closed Principle,OCP)
Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP)
Tom彈架構:單一職責原則(Simple Responsibility Pinciple,SRP)
Tom彈架構:接口隔離原則(Interface Segregation Principle, ISP)