最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

迪米特法則_動力節(jié)點Java學院整理

 更新時間:2017年08月07日 10:23:40   作者:zhengzhb  
這篇文章主要介紹了迪米特法則,迪米特法則就是一個在類創(chuàng)建方法和屬性時需要遵守的法則,有興趣的可以了解一下

定義:一個對象應該對其他對象保持最少的了解。

問題由來:類與類之間的關(guān)系越密切,耦合度越大,當一個類發(fā)生改變時,對另一個類的影響也越大。

解決方案:盡量降低類與類之間的耦合。

自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內(nèi)聚。無論是面向過程編程還是面向?qū)ο缶幊?,只有使各個模塊之間的耦合盡量的低,才能提高代碼的復用率。低耦合的優(yōu)點不言而喻,但是怎么樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。

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

舉一個例子:有一個集團公司,下屬單位有分公司和直屬部門,現(xiàn)在要求打印出所有下屬單位的員工ID。先來看一下違反迪米特法則的設(shè)計。

 //總公司員工
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();
  //為分公司人員按順序分配一個ID
  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();
  //為總公司人員按順序分配一個ID
  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());
 }
} 

現(xiàn)在這個設(shè)計的主要問題出在CompanyManager中,根據(jù)迪米特法則,只與直接的朋友發(fā)生通信,而SubEmployee類并不是CompanyManager類的直接朋友(以局部變量出現(xiàn)的耦合不屬于直接朋友),從邏輯上講總公司只與他的分公司耦合就行了,與分公司的員工并沒有任何聯(lián)系,這樣設(shè)計顯然是增加了不必要的耦合。按照迪米特法則,應該避免類中出現(xiàn)這樣非直接朋友關(guān)系的耦合。修改后的代碼如下:

class SubCompanyManager{
 public List<SubEmployee> getAllEmployee(){
 List<SubEmployee> list = new ArrayList<SubEmployee>();
 for(int i=0; i<100; i++){
  SubEmployee emp = new SubEmployee();
  //為分公司人員按順序分配一個ID
  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();
  //為總公司人員按順序分配一個ID
  emp.setId("總公司"+i);
  list.add(emp);
 }
 return list;
 }
 
 public void printAllEmployee(SubCompanyManager sub){
 sub.printEmployee();
 List<Employee> list2 = this.getAllEmployee();
 for(Employee e:list2){
  System.out.println(e.getId());
 }
 }
}

修改后,為分公司增加了打印人員ID的方法,總公司直接調(diào)用來打印,從而避免了與分公司的員工發(fā)生耦合。

迪米特法則的初衷是降低類之間的耦合,由于每個類都減少了不必要的依賴,因此的確可以降低耦合關(guān)系。但是凡事都有度,雖然可以避免與非直接的類通信,但是要通信,必然會通過一個“中介”來發(fā)生聯(lián)系,例如本例中,總公司就是通過分公司這個“中介”來與分公司的員工發(fā)生聯(lián)系的。過分的使用迪米特原則,會產(chǎn)生大量這樣的中介和傳遞類,導致系統(tǒng)復雜度變大。所以在采用迪米特法則時要反復權(quán)衡,既做到結(jié)構(gòu)清晰,又要高內(nèi)聚低耦合。

相關(guān)文章

  • 簡單講解Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法

    簡單講解Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法

    這篇文章主要介紹了Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下
    2015-12-12
  • Java語法關(guān)于泛型與類型擦除的分析

    Java語法關(guān)于泛型與類型擦除的分析

    泛型沒有其看起來那么深不可測,它并不神秘與神奇,泛型是Java 中一個很小巧的概念,但同時也是一個很容易讓人迷惑的知識點,它讓人迷惑的地方在于它的許多表現(xiàn)有點違反直覺
    2021-09-09
  • Java Socket實現(xiàn)單線程通信的方法示例

    Java Socket實現(xiàn)單線程通信的方法示例

    這篇文章主要介紹了Java Socket實現(xiàn)單線程通信的方法,結(jié)合具體實例形式分析了java socket單線程通信的原理與客戶端、服務(wù)器端相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • 詳解java如何正確使用volatile

    詳解java如何正確使用volatile

    這篇文章給大家分享了java如何正確使用volatile的相關(guān)知識點內(nèi)容,有興趣的朋友可以參考學習下。
    2018-07-07
  • SpringBoot使用SensitiveWord實現(xiàn)敏感詞過濾

    SpringBoot使用SensitiveWord實現(xiàn)敏感詞過濾

    這篇文章主要為大家詳細介紹了SpringBoot如何使用SensitiveWord實現(xiàn)敏感詞過濾功能,文中示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-01-01
  • Java超詳細教你寫一個學籍管理系統(tǒng)案例

    Java超詳細教你寫一個學籍管理系統(tǒng)案例

    這篇文章主要介紹了怎么用Java來寫一個學籍管理系統(tǒng),學籍管理主要涉及到學生信息的增刪查改,本篇將詳細的實現(xiàn),感興趣的朋友跟隨文章往下看看吧
    2022-03-03
  • java程序設(shè)計語言的優(yōu)勢及特點

    java程序設(shè)計語言的優(yōu)勢及特點

    在本篇文章里小編給大家分享的是一篇關(guān)于java程序設(shè)計語言的優(yōu)勢及特點的內(nèi)容,需要的朋友們可以學習參考下。
    2020-02-02
  • Springboot+devtools配置熱部署過程

    Springboot+devtools配置熱部署過程

    SpringBoot提供的spring-boot-devtools模塊可以實現(xiàn)應用的熱部署,極大提升開發(fā)效率,通過添加POM依賴、配置yml文件、使用IDE快捷鍵等步驟,可以無需手動重啟即可自動加載變更,這種方式不僅適用于靜態(tài)文件的自動加載,也適用于整個SpringBoot工程,是提高開發(fā)效率的有效手段
    2024-11-11
  • 在Spring Boot框架中使用AOP的正確姿勢

    在Spring Boot框架中使用AOP的正確姿勢

    aop是spring的兩大功能模塊之一,功能非常強大,為解耦提供了非常優(yōu)秀的解決方案。下面這篇文章主要給大家介紹了如何在Spring Boot框架中使用AOP的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • Spring項目中Ordered接口的應用之全局過濾器(GlobalFilter)的順序控制

    Spring項目中Ordered接口的應用之全局過濾器(GlobalFilter)的順序控制

    在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux項目中,Ordered接口扮演著重要的角色,特別是在實現(xiàn)全局過濾器(GlobalFilter)時,用于控制過濾器執(zhí)行的優(yōu)先級,下面將介紹如何在Spring項目中使用Ordered接口來管理Global Filter的執(zhí)行順序,需要的朋友可以參考下
    2024-06-06

最新評論

津市市| 扶余县| 大邑县| 黑龙江省| 北碚区| 五台县| 阜阳市| 黄平县| 襄汾县| 桂阳县| 民勤县| 剑河县| 黑水县| 平顺县| 奉新县| 比如县| 阳山县| 康马县| 博白县| 东光县| 抚顺市| 施甸县| 扬中市| 阿克| 大渡口区| 侯马市| 体育| 上思县| 陆丰市| 体育| 诏安县| 申扎县| 万安县| 邹城市| 新民市| 鄂州市| 文山县| 渝北区| 勐海县| 靖州| 织金县|