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

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

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

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

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

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

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

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

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

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

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

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

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

舉一個例子:有一個集團(tuán)公司,下屬單位有分公司和直屬部門,現(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)文章

  • List轉(zhuǎn)變?yōu)槎禾柗指舻腟tring(Java7和Java8分別實現(xiàn))

    List轉(zhuǎn)變?yōu)槎禾柗指舻腟tring(Java7和Java8分別實現(xiàn))

    這篇文章主要介紹了Java7和Java8分別實現(xiàn)List轉(zhuǎn)變?yōu)槎禾柗指舻腟tring,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)...
    2006-12-12
  • Springmvc返回html頁面問題如何解決

    Springmvc返回html頁面問題如何解決

    這篇文章主要介紹了Springmvc返回html頁面問題如何解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot中使用RocketMQ的示例代碼

    SpringBoot中使用RocketMQ的示例代碼

    本文主要介紹SpringBoot中使用RocketMQ的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring IOC (DI) 依賴注入的四種方式示例詳解

    Spring IOC (DI) 依賴注入的四種方式示例詳解

    這篇文章主要介紹了Spring IOC (DI) 依賴注入的四種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot整合WebSocket的客戶端和服務(wù)端的實現(xiàn)代碼

    SpringBoot整合WebSocket的客戶端和服務(wù)端的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot整合WebSocket的客戶端和服務(wù)端的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Java如何通過反射獲取對象的屬性和值

    Java如何通過反射獲取對象的屬性和值

    這篇文章主要介紹了Java如何通過反射獲取對象的屬性和值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • java中處理stream.filter()的實例代碼

    java中處理stream.filter()的實例代碼

    stream()是Java 8中的一個函數(shù)式接口,用于處理數(shù)據(jù)流,它可以從一個數(shù)據(jù)源,如集合,數(shù)組等生成一個流,這篇文章主要給大家介紹了關(guān)于java中處理stream.filter()的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送

    SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送

    這篇文章主要介紹了SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java 圖解Spring啟動時的后置處理器工作流程是怎樣的

    Java 圖解Spring啟動時的后置處理器工作流程是怎樣的

    spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期
    2021-10-10

最新評論

措美县| 台中市| 旅游| 库车县| 通道| 凉山| 西贡区| 乐都县| 定陶县| 永福县| 定安县| 当雄县| 五华县| 宾川县| 买车| 广南县| 原阳县| 大关县| 昭平县| 尚义县| 长顺县| 岳普湖县| 普格县| 社旗县| 五大连池市| 栾城县| 金川县| 通化市| 蒙山县| 综艺| 绥棱县| 和田县| 岳西县| 贵州省| 贵南县| 克东县| 特克斯县| 杨浦区| 登封市| 浏阳市| 苏州市|