一個對象應當對其他對象有盡可能少的了解。

11.1 迪米特法則的各種表述:
1)只與你直接的朋友們通信。
2)不要跟“陌生人”說話。
3)每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關的軟件單位。

11.2 狹義的迪米特法則
如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果其中的一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。

朋友圈的確定
“朋友”條件:
1)當前對象本身(this)
2)以參量形式傳入到當前對象方法中的對象
3)當前對象的實例變量直接引用的對象
4)當前對象的實例變量如果是一個聚集,那么聚集中的元素也都是朋友
5)當前對象所創建的對象
任何一個對象,如果滿足上面的條件之一,就是當前對象的“朋友”;否則就是“陌生人”。
缺點:會在系統里造出大量的小方法,散落在系統的各個角落。

與依賴倒轉原則互補使用

11.3 迪米特法則與設計模式
門面模式*
調停者模式*

11.4 廣義的迪米特法則
迪米特法則的主要用意是控制信息的過載。在將迪米特法則運用到系統設計中時,要注意下面的幾點:
1)在類的劃分上,應當創建有弱耦合的類。
2)在類的結構設計上,每一個類都應當盡量降低成員的訪問權限。
3)在類的設計上,只要有可能,一個類應當設計成不變類。
4)在對其他類的引用上,一個對象對其對象的引用應當降到最低。

11.5 廣義迪米特法則在類的設計上的體現
1)優先考慮將一個類設置成不變類
2)盡量降低一個類的訪問權限
3)謹慎使用Serializable
4)盡量降低成員的訪問權限
5)取代C Struct

一個類似于C Struct的Java類:

public ? class ?Point
{
??
public ? int ?x;
??
public ? int ?y;
}

一個好的設計:
public?class?Point
{
??
private?int?x;
??
private?int?y;
??
public?Point(int?x,?int?y)
??
{
????
this.x?=?x;
????
this.y?=?y;
??}

??
public?int?getX()
??
{
????
return?x;
??}

??
public?int?getY()
??
{
????
return?y;
??}

??
public?void?setX(int?x)
??
{
????
this.x?=?x;
??}

??
public?void?setY(int?y)
??
{
????
this.y?=?y;
??}

}

11.6 廣義迪米特法則在代碼層次上的實現
1)限制局域變量的有效范圍

歡迎大家訪問我的個人網站 萌萌的IT人