設計模式原則5 迪公尺特法則

2021-08-19 09:46:14 字數 3074 閱讀 6103

迪公尺特法則(law of demeter, lod)也稱為最少知識原則(least knowledge principle, lkp),乙個物件應該對其他物件有最少的了解。通俗來講,乙個類應該對自己需要耦合或呼叫的類知道的最少。我就知道你提供的這麼多public方法,我就呼叫這麼多,其他的我一概不關心。

迪公尺特法則的英文解釋是,only talk to your immediate friends,只和直接的朋友通訊。每個物件都必然會與其他物件有耦合關係,兩個物件之間的耦合就成為朋友關係,這種關係的型別有很多,例如組合、聚合、依賴等。

例如,老師讓體育委員清點一下班裡女生到齊沒有。其uml圖為:

老師類:

public

class teacher

//告訴體育委員開始執行清查任務

groupleader.countgirls(listgirls);}}

體育委員類:

public

class groupleader

}

女生類:

public

class girl

場景類:

public

class client

}

執行結果:

女生數量是:20
然而,我們發現,體育老師和不相關的girls產生了依賴,這是違反迪公尺特法則的。朋友類的定義是,出現在成員變數、方法的輸入輸出引數中的類稱為成員朋友,而出現在方法體內部的類不屬於朋友類,而girl這個類就是出現在commond方法體內,因此不屬於teacher類的朋友類。迪公尺特法則告訴我們乙個類只和朋友交流,但是我們剛才定義的commond方法卻和girl類有了交流,宣告了乙個list < girls >陣列,也就是與乙個陌生的類girl有了交流,這就破壞了teacher的健壯性。方法是類的乙個行為,類竟然不知道自己的行為與其他類產生依賴關係,這是不允許的,嚴重違反了迪公尺特法則。

我們做一下調整,uml類圖為:

修改後的體育老師類:

public

class teacher

}

修改後的體育委員類:

public

class groupleader

//清查女生數量

public

void

countgirls()

}

修改後的場景類:

public

class client

teacher teacher = new teacher();

//老師發布命令

teacher.commond(new groupleader(listgirls));}}

這樣避開了teacher類對陌生類girl的直接訪問,降低了系統間的耦合,提高了系統的健壯性。

比如說對於乙個軟體安裝過程,假設有三步,其uml類圖為:

導向類:

public

class wizard

//second step

public

intsecond()

//third step

public

intthird()

installsoftware類:

public

class installsoftware }}

}}

場景類:

public

class client

}

對於上述設計,wizard類把太多的方法暴露給installsoftware類,兩者的朋友關係太親密了,耦合關係變得異常牢固。如果要將wizard類中的first方法返回值的型別由int改為boolean,就需要修改installsoftware類,從而把修改變更的風險擴散開了。因此,這樣的耦合是季度不合適的,對其進行重構:

在wizard類中增加乙個installwizard方法,對安裝過程進行封裝,同時把原有的三個public方法修改為private方法。

修改後的導向類:

public

class wizard

//second step

private

intsecond()

//third step

private

intthird()

//軟體安裝過程

public

void

installwizard(wizard wizard)}}

}}

修改後的installsoftware類:

public

class installsoftware

}

將三個步驟的訪問許可權修改為private,同時把installsoftware中的方法installwizard移動到wizard方法中,通過這樣重構,wizard類就只對外公布了乙個public方法,即使再修改first方法的返回值,影響的也僅僅只是wizard本身,其他類不受影響,這顯示了高內聚的特性。

如果乙個方法放在本類中,既不增加類間關係,也對本類不產生負面影響,那就放置在本類中。

迪公尺特法則的核心觀念是類間解耦,弱耦合,只有弱耦合了以後,類的復用率才可以提高。

設計模式 迪公尺特法則

一,概述 迪公尺特法則 law of demeter 又叫作最少知識原則 least knowledge principle 簡寫lkp 就是說乙個物件應當對其他物件有盡可能少的了解,不和陌生人說話。英文簡寫為 lod 如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接相互作用。如果其中乙個類...

設計模式 迪公尺特法則

設計模式 迪公尺特法則 only talk to your immediate friends 只與直接的朋友通訊。即每個物件都有耦合關係,物件之間有耦合。定義老師類 public class teacher 然後進行查詢任務 groupleader.countgirls listgirls 然後定...

設計原則之迪公尺特法則

設計原則之迪公尺特法則 設計原則之迪公尺特法則 如果兩個類彼此不必直接通訊,那麼著兩個類就不應當發生直接的相互作用.如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三方 這個呼叫.舉個列子來說,你要it部門的人修理機器,打 的時候問 請問是it部門嗎?這樣對方無論是it部門經理還是it部門...