多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 設計模式六大原則(5):迪米特法則

設計模式六大原則(5):迪米特法則

來源:程序員人生   發布時間:2017-02-18 08:49:45 閱讀次數:3074次
定義:1個對象應當對其他對象保持最少的了解。

問題由來:類與類之間的關系越密切,耦合度越大,當1個類產生改變時,對另外一個類的影響也越大。

解決方案:盡可能下降類與類之間的耦合。

         自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內聚。不管是面向進程編程還是面向對象編程,只有使各個模塊之間的耦合盡可能的低,才能提高代碼的復用率。低耦合的優點不言而喻,但是怎樣樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。

         迪米特法則又叫最少知道原則,最早是在1987年由美國Northeastern University的Ian Holland提出。通俗的來說,就是1個類對自己依賴的類知道的越少越好。也就是說,對被依賴的類來講,不管邏輯多么復雜,都盡可能地的將邏輯封裝在類的內部,對外除提供的public方法,不對外泄漏任何信息。迪米特法則還有1個更簡單的定義:只與直接的朋友通訊。首先來解釋1下甚么是直接的朋友:每一個對象都會與其他對象有耦合關系,只要兩個對象之間有耦合關系,我們就說這兩個對象之間是朋友關系。耦合的方式很多,依賴、關聯、組合、聚合等。其中,我們稱出現成員變量、方法參數、方法返回值中的類為直接的朋友,而出現在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的情勢出現在類的內部。

         舉1個例子:有1個團體公司,下屬單位有分公司和直屬部門,現在要求打印出所有下屬單位的員工ID。先來看1下違背迪米特法則的設計。

[java] view plain copy
  1. //總公司員工  
  2. class Employee{  
  3.     private String id;  
  4.     public void setId(String id){  
  5.         this.id = id;  
  6.     }  
  7.     public String getId(){  
  8.         return id;  
  9.     }  
  10. }  
  11.   
  12. //分公司員工  
  13. class SubEmployee{  
  14.     private String id;  
  15.     public void setId(String id){  
  16.         this.id = id;  
  17.     }  
  18.     public String getId(){  
  19.         return id;  
  20.     }  
  21. }  
  22.   
  23. class SubCompanyManager{  
  24.     public List<SubEmployee> getAllEmployee(){  
  25.         List<SubEmployee> list = new ArrayList<SubEmployee>();  
  26.         for(int i=0; i<100; i++){  
  27.             SubEmployee emp = new SubEmployee();  
  28.             //為分公司人員按順序分配1個ID  
  29.             emp.setId("分公司"+i);  
  30.             list.add(emp);  
  31.         }  
  32.         return list;  
  33.     }  
  34. }  
  35.   
  36. class CompanyManager{  
  37.   
  38.     public List<Employee> getAllEmployee(){  
  39.         List<Employee> list = new ArrayList<Employee>();  
  40.         for(int i=0; i<30; i++){  
  41.             Employee emp = new Employee();  
  42.             //為總公司人員按順序分配1個ID  
  43.             emp.setId("總公司"+i);  
  44.             list.add(emp);  
  45.         }  
  46.         return list;  
  47.     }  
  48.       
  49.     public void printAllEmployee(SubCompanyManager sub){  
  50.         List<SubEmployee> list1 = sub.getAllEmployee();  
  51.         for(SubEmployee e:list1){  
  52.             System.out.println(e.getId());  
  53.         }  
  54.   
  55.         List<Employee> list2 = this.getAllEmployee();  
  56.         for(Employee e:list2){  
  57.             System.out.println(e.getId());  
  58.         }  
  59.     }  
  60. }  
  61.   
  62. public class Client{  
  63.     public static void main(String[] args){  
  64.         CompanyManager e = new CompanyManager();  
  65.         e.printAllEmployee(new SubCompanyManager());  
  66.     }  
  67. }  

        現在這個設計的主要問題出在CompanyManager中,根據迪米特法則,只與直接的朋友產生通訊,而SubEmployee類其實不是CompanyManager類的直接朋友(以局部變量出現的耦合不屬于直接朋友),從邏輯上講總公司只與他的分公司耦合就好了,與分公司的員工并沒有任何聯系,這樣設計明顯是增加了沒必要要的耦合。依照迪米特法則,應當避免類中出現這樣非直接朋友關系的耦合。修改后的代碼以下:

[java] view plain copy
  1. class SubCompanyManager{  
  2.     public List<SubEmployee> getAllEmployee(){  
  3.         List<SubEmployee> list = new ArrayList<SubEmployee>();  
  4.         for(int i=0; i<100; i++){  
  5.             SubEmployee emp = new SubEmployee();  
  6.             //為分公司人員按順序分配1個ID  
  7.             emp.setId("分公司"+i);  
  8.             list.add(emp);  
  9.         }  
  10.         return list;  
  11.     }  
  12.     public void printEmployee(){  
  13.         List<SubEmployee> list = this.getAllEmployee();  
  14.         for(SubEmployee e:list){  
  15.             System.out.println(e.getId());  
  16.         }  
  17.     }  
  18. }  
  19.   
  20. class CompanyManager{  
  21.     public List<Employee> getAllEmployee(){  
  22.         List<Employee> list = new ArrayList<Employee>();  
  23.         for(int i=0; i<30; i++){  
  24.             Employee emp = new Employee();  
  25.             //為總公司人員按順序分配1個ID  
  26.             emp.setId("總公司"+i);  
  27.             list.add(emp);  
  28.         }  
  29.         return list;  
  30.     }  
  31.       
  32.     public void printAllEmployee(SubCompanyManager sub){  
  33.         sub.printEmployee();  
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 精品一区二区三区 不卡高清 | jizz免费| 亚洲视频在线一区二区三区 | a级网站| 亚洲免费午夜视频 | 日本中文字幕在线观看视频 | 高清午夜线观看免费 | 欧美人与动人物姣配xxxx | 美女上床视频 | 一区二区免费 | 天堂在线www网亚洲 天堂在线xw | 国产亚洲一区二区精品 | 亚洲第一免费视频 | 成人自拍小视频 | 亚洲第二页 | 亚洲xxxxxx| 亚洲天堂亚洲天堂 | 亚洲一区二区三区四区 | 亚洲成人在线视频 | 欧美在线亚洲国产免m观看 欧美在线一二三 | 尤物在线 | 亚洲精品国产字幕久久不卡 | free性欧美xxx狂欢 | 亚洲成人观看 | 久久精品国产欧美日韩亚洲 | 亚欧成人中文字幕一区 | 亚洲a毛片 | 成人交性视频免费看 | 亚洲成人毛片 | 亚洲欲色| 日韩欧美亚州 | 性做久久久久久免费观看 | 成人娱乐网站 | 97久久综合区小说区图片专区 | 在线人成精品免费视频 | 亚洲国产日韩成人综合天堂 | 久草在线视频福利 | 性色a∨人人爽网站 | 亚洲成a | 久久久久日韩精品免费观看网 | 手机看片福利久久 |