一個對象應(yīng)當(dāng)對其他對象有盡可能少的了解。

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

11.2 狹義的迪米特法則
如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個類需要調(diào)用另一個類的某一個方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。

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

與依賴倒轉(zhuǎn)原則互補使用

11.3 迪米特法則與設(shè)計模式
門面模式*
調(diào)停者模式*

11.4 廣義的迪米特法則
迪米特法則的主要用意是控制信息的過載。在將迪米特法則運用到系統(tǒng)設(shè)計中時,要注意下面的幾點:
1)在類的劃分上,應(yīng)當(dā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)降到最低。

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

一個類似于C Struct的Java類:

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

一個好的設(shè)計:
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 廣義迪米特法則在代碼層次上的實現(xiàn)
1)限制局域變量的有效范圍

歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人