欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的設(shè)計模式編程中迪米特法則的應(yīng)用示例

 更新時間:2016年02月03日 14:59:36   作者:卡奴達摩  
這篇文章主要介紹了Java的設(shè)計模式編程中迪米特法則的應(yīng)用示例,迪米特法則中主張創(chuàng)建和使用弱耦合的類,需要的朋友可以參考下

定義:一個對象應(yīng)該對其他對象了解最少

迪米特法則的核心觀念就是類間解耦,弱耦合,只有弱耦合了以后,類的復(fù)用性才可以提高。

形象一點的比喻類似于:監(jiān)獄內(nèi)的犯人是不應(yīng)該跟外面的人接觸的,當然或許會有探親的。這里的監(jiān)獄就是類,里面的犯人就是類內(nèi)部的信息,而監(jiān)獄里的獄警就相當于迪米特法則的執(zhí)行者

迪米特法則主張:
(1)在類的劃分上,應(yīng)該創(chuàng)建有弱耦合的類;

(2)在類的結(jié)構(gòu)設(shè)計上,每一個類都應(yīng)當盡量降低成員的訪問權(quán)限;

(3)在類的設(shè)計上,只要有可能,一個類應(yīng)當設(shè)計成不變類;

(4)在對其他類的引用上,一個對象對其它對象的引用應(yīng)當降到最低;

(5)盡量降低類的訪問權(quán)限;

(6)謹慎使用序列化功能;

(7)不要暴露類成員,而應(yīng)該提供相應(yīng)的訪問器(屬性)。

舉一個例子:有一個集團公司,下屬單位有分公司和直屬部門,現(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è)計顯然是增加了不必要的耦合。按照迪米特法則,應(yīng)該避免類中出現(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)生大量這樣的中介和傳遞類,導(dǎo)致系統(tǒng)復(fù)雜度變大。所以在采用迪米特法則時要反復(fù)權(quán)衡,既做到結(jié)構(gòu)清晰,又要高內(nèi)聚低耦合。

相關(guān)文章

  • Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例

    Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例

    這篇文章主要介紹了Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • MyBatis核心配置文件深入分析

    MyBatis核心配置文件深入分析

    這篇文章主要介紹了MyBatis核心配置文件,MyBatis的前身就是iBatis,iBatis本是由Clinton Begin開發(fā),后來捐給Apache基金會,成立了iBatis開源項目。2010年5月該項目由Apahce基金會遷移到了Google Code,并且改名為MyBatis
    2022-12-12
  • IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    這篇文章主要介紹了IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java判斷線程池線程是否執(zhí)行完畢

    Java判斷線程池線程是否執(zhí)行完畢

    這篇文章主要介紹了Java判斷線程池線程是否執(zhí)行完畢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • springMVC使用ajaxFailUpload上傳圖片的方法

    springMVC使用ajaxFailUpload上傳圖片的方法

    這篇文章主要介紹了springMVC使用ajaxFailUpload上傳圖片的相關(guān)知識,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • 如何實現(xiàn)廣告彈窗觸達頻率的控制?

    如何實現(xiàn)廣告彈窗觸達頻率的控制?

    這篇文章主要介紹了如何實現(xiàn)廣告彈窗觸達頻率的控制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot HATEOAS用法簡介(入門)

    SpringBoot HATEOAS用法簡介(入門)

    這篇文章主要介紹了SpringBoot HATEOAS用法簡介(入門),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • RocketMQ中的NameServer詳細解析

    RocketMQ中的NameServer詳細解析

    這篇文章主要介紹了RocketMQ中的NameServer詳細解析,NameServer是一個非常簡單的Topic路由注冊中心,支持Broker的動態(tài)注冊與發(fā)現(xiàn),因此不能保證NameServer的一致性,需要的朋友可以參考下
    2024-01-01
  • Spring WebSocket 404錯誤的解決方法

    Spring WebSocket 404錯誤的解決方法

    這篇文章主要為大家詳細介紹了Spring WebSocket 404錯誤的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java Web 實現(xiàn)QQ登錄功能一個帳號同一時間只能一個人登錄

    Java Web 實現(xiàn)QQ登錄功能一個帳號同一時間只能一個人登錄

    對于一個帳號在同一時間只能一個人登錄,下文給大家介紹的非常詳細,對java web qq 登錄功能感興趣的朋友一起看看吧
    2016-11-11

最新評論