設計模式六大原則(5):迪米特法則
來源:程序員人生 發布時間:2017-02-18 08:49:45 閱讀次數:3074次
定義:1個對象應當對其他對象保持最少的了解。
問題由來:類與類之間的關系越密切,耦合度越大,當1個類產生改變時,對另外一個類的影響也越大。
解決方案:盡可能下降類與類之間的耦合。
自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內聚。不管是面向進程編程還是面向對象編程,只有使各個模塊之間的耦合盡可能的低,才能提高代碼的復用率。低耦合的優點不言而喻,但是怎樣樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。
迪米特法則又叫最少知道原則,最早是在1987年由美國Northeastern University的Ian Holland提出。通俗的來說,就是1個類對自己依賴的類知道的越少越好。也就是說,對被依賴的類來講,不管邏輯多么復雜,都盡可能地的將邏輯封裝在類的內部,對外除提供的public方法,不對外泄漏任何信息。迪米特法則還有1個更簡單的定義:只與直接的朋友通訊。首先來解釋1下甚么是直接的朋友:每一個對象都會與其他對象有耦合關系,只要兩個對象之間有耦合關系,我們就說這兩個對象之間是朋友關系。耦合的方式很多,依賴、關聯、組合、聚合等。其中,我們稱出現成員變量、方法參數、方法返回值中的類為直接的朋友,而出現在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的情勢出現在類的內部。
舉1個例子:有1個團體公司,下屬單位有分公司和直屬部門,現在要求打印出所有下屬單位的員工ID。先來看1下違背迪米特法則的設計。
-
-
class Employee{
-
private String id;
-
public void setId(String id){
-
this.id = id;
-
}
-
public String getId(){
-
return id;
-
}
-
}
-
-
-
class SubEmployee{
-
private String id;
-
public void setId(String id){
-
this.id = id;
-
}
-
public String getId(){
-
return id;
-
}
-
}
-
-
class SubCompanyManager{
-
public List<SubEmployee> getAllEmployee(){
-
List<SubEmployee> list = new ArrayList<SubEmployee>();
-
for(int i=0; i<100; i++){
-
SubEmployee emp = new SubEmployee();
-
-
emp.setId("分公司"+i);
-
list.add(emp);
-
}
-
return list;
-
}
-
}
-
-
class CompanyManager{
-
-
public List<Employee> getAllEmployee(){
-
List<Employee> list = new ArrayList<Employee>();
-
for(int i=0; i<30; i++){
-
Employee emp = new Employee();
-
-
emp.setId("總公司"+i);
-
list.add(emp);
-
}
-
return list;
-
}
-
-
public void printAllEmployee(SubCompanyManager sub){
-
List<SubEmployee> list1 = sub.getAllEmployee();
-
for(SubEmployee e:list1){
-
System.out.println(e.getId());
-
}
-
-
List<Employee> list2 = this.getAllEmployee();
-
for(Employee e:list2){
-
System.out.println(e.getId());
-
}
-
}
-
}
-
-
public class Client{
-
public static void main(String[] args){
-
CompanyManager e = new CompanyManager();
-
e.printAllEmployee(new SubCompanyManager());
-
}
-
}
現在這個設計的主要問題出在CompanyManager中,根據迪米特法則,只與直接的朋友產生通訊,而SubEmployee類其實不是CompanyManager類的直接朋友(以局部變量出現的耦合不屬于直接朋友),從邏輯上講總公司只與他的分公司耦合就好了,與分公司的員工并沒有任何聯系,這樣設計明顯是增加了沒必要要的耦合。依照迪米特法則,應當避免類中出現這樣非直接朋友關系的耦合。修改后的代碼以下:
-
class SubCompanyManager{
-
public List<SubEmployee> getAllEmployee(){
-
List<SubEmployee> list = new ArrayList<SubEmployee>();
-
for(int i=0; i<100; i++){
-
SubEmployee emp = new SubEmployee();
-
-
emp.setId("分公司"+i);
-
list.add(emp);
-
}
-
return list;
-
}
-
public void printEmployee(){
-
List<SubEmployee> list = this.getAllEmployee();
-
for(SubEmployee e:list){
-
System.out.println(e.getId());
-
}
-
}
-
}
-
-
class CompanyManager{
-
public List<Employee> getAllEmployee(){
-
List<Employee> list = new ArrayList<Employee>();
-
for(int i=0; i<30; i++){
-
Employee emp = new Employee();
-
-
emp.setId("總公司"+i);
-
list.add(emp);
-
}
-
return list;
-
}
-
-
public void printAllEmployee(SubCompanyManager sub){
-
sub.printEmployee();
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈