Android設計模式六大原則之迪米特原則
迪米特原則又被稱為 最少知識原則 ,意思就是說呢,一個物件應該對其他物件有最少的瞭解。我們知道,一個類如果太依賴另一個類,那麼他們之間耦合度就會很大,當一個類發生改變時,對另一個類產生的影響也會很大的。
迪米特法則還有一個更簡單的定義:只與直接的朋友通訊
迪米特原則遵循程式設計原則 : 低內聚,高耦合。 只有使各個模組之間的耦合儘量的低,才能提高程式碼的複用率。
好了,定義和規則我們也都知道了,那接下來我們就場景配合程式碼示例來講講怎麼運用迪米特原則。
在學校裡,有校長,班級(班主任),學生等幾種角色,校長想要了解某個班學生的本學期考試的學習成績和其他情況。
假如在不遵循迪米特原則的情況下:
(1)定義學生類
//學生類 public class Student { private int id;//學生編號 private String name;//學生姓名 private float score;//學生分數 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } }
(2)定義班級類
//班級類 public class Class { public int id;//班級編號 public String className;//班級名稱 public List<Student> studentList;//學生列表 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } }
(3)定義校長類,可以列印獲得某個班超過指定分數的同學,也可以獲得某個班的優異比例
//校長類 public class HeadMaster { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } //列印超過指定分數的學生 public void printStudentsByScore(float score, Class c) { List<Student> students = c.getStudentList(); for (Student s : students) { if (s.getScore() >= score) { System.out.println(c.getClassName() + s.getName() + " : " + s.getScore()); } } } //列印學生考分優異比例 public void printExcellentProportion(float score, Class c) { List<Student> students = c.getStudentList(); int total = students.size();//學生總數 int num = 0;//用來記錄超過指定分數的學生數量 for (Student s : students) { if (s.getScore() >= score) { num++; } } float excellentProportion = (float) num / total; DecimalFormat df = new DecimalFormat("##0.00"); System.out.println(c.getClassName() + " 優異分數佔比 : " + df.format(excellentProportion)); } }
完成任務是沒問題,但是某天校長說:累死我了,一到六年級,每個年級四個班,只檢視每個班的優異比例都夠累的,其他的工作根本沒法展開。

我們看下,問題出在了哪裡,校長跟學生之間的接觸太多了,什麼事情都親力親為,那一個學校,只要你一個校長就夠了。很顯然這肯定是不行的。按照迪米特原則,我們應該怎麼改進呢,學生和班主任是直接溝通的,班主任和校長是直接溝通的。那麼校長和學生之間幾乎是沒有什麼溝通的。那麼可以按照迪米特原則這樣改。
這樣,之前校長多做的事情由負責班級的班主任來做。實現各盡其責。
//班級類 public class Class { public int id;//班級編號 public String className;//班級名稱 public List<Student> studentList;//學生列表 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } //列印超過指定分數的學生 public void printStudentsByScore(float score) { List<Student> students = this.studentList; for (Student s : students) { if (s.getScore() >= score) { System.out.println(this.className + s.getName() + " : " + s.getScore()); } } } //列印學生考分優異比例 public void printExcellentProportion(float score) { List<Student> students = this.studentList; int total = students.size();//學生總數 int num = 0;//用來記錄超過指定分數的學生數量 for (Student s : students) { if (s.getScore() >= score) { num++; } } float excellentProportion = (float) num / total; DecimalFormat df = new DecimalFormat("##0.00"); System.out.println(this.className + " 優異分數佔比 : " + df.format(excellentProportion)); } }
接下來校長,只需要向指定班級的班主任,詢問獲取結果即可。
//校長類 public class HeadMaster { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } //列印超過指定分數的學生 public void printStudentsByScore(float score, Class c) { c.printStudentsByScore(score); } //列印學生考分優異比例 public void printExcellentProportion(float score, Class c) { c.printExcellentProportion(score); } public void doOtherTask(){ System.out.print("我終於可以有時間做其他工作了"); } }
我們看校長,詢問班主任學生學習情況,很方便了,而且,當家長問起學生所在班級情況的時候也很方便了,因為這些班主任自己已經瞭如執掌了,不再像之前對自己的班級一問三不知了。

其實在我們工作中,這種場景也非常多,比如使用者,開發人員,領導。領導想知道,這個月使用者的訪問記錄,不同年齡段的人群佔比。
你直接按照要求將訪問記錄匯出來傳送給了領導,那領導還不瘋了,這麼多記錄,他什麼也不用幹了。
相反如果,遵循迪米特原則,開發人員是直接接觸使用者訪問記錄的,那麼如果他將這些資料進行統計分類,且不說給一個扇形或者柱狀圖,即使用語言描述出來,領導看完,也只是分分鐘鐘的事情,這樣才能順利高效的進行下一步,對吧。

寫在最後:改變世界,先從改變自己開始。—我說的
你也可以關注我的公眾號: 碼H.cam , 隨時隨地學習設計模式