設計模式系列 迪公尺特法則

2021-07-13 07:48:55 字數 1912 閱讀 2240

問題由來:類與類之間的關係越密切,耦合度越大,當乙個類發生改變時,對另乙個類的影響也越大。

解決方案:盡量降低類與類之間的耦合。

自從我們接觸程式設計開始,就知道了軟體程式設計的總的原則:低耦合,高內聚。無論是面向過程程式設計還是物件導向程式設計,只有使各個模組之間的耦合盡量的低,才能提高**的復用率。低耦合的優點不言而喻,但是怎麼樣程式設計才能做到低耦合呢?那正是迪公尺特法則要去完成的。

乙個軟體實體應當盡可能少的與其他實體發生相互作用。乙個物件應該對其他物件有最少的了解。通俗的講,乙個類應該對自己需要耦合呼叫的類知道得最少,你(被耦合或呼叫的類)的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的這麼多public方法,我就呼叫這麼多,其他的我一概不關心。即:乙個物件對其他物件的引用應該降到最低。

迪公尺特法則對類的低耦合做了明確的要求,其包含以下4層含義:

迪公尺特法則的核心觀念就是:類間解耦、弱耦合,只有弱耦合了,類的復用性才可以提高,其要求的結果就是產生了大量的中轉或跳轉類,導致系統的複雜性提高,同時也為維護帶來了難度。我們在使用時要反覆權衡,既做到結構清晰,又做到高內聚低耦合。另外解耦是有限度的,需要適當的考慮這個原則。防止過猶不及。

舉乙個例子:有乙個集團公司,下屬單位有分公司和直屬部門,現在要求列印出所有下屬單位的員工id。先來看一下違反迪公尺特法則的設計。

//總公司員工  

class employee

public string getid()

} //分公司員工

class subemployee

public string getid()

} class subcompanymanager

return list;

} }

class companymanager

return list;

} public

void

printallemployee(subcompanymanager sub)

listlist2 = this.getallemployee();

for(employee e:list2)

} }

public

class client

}

現在這個設計的主要問題出在companymanager中,根據迪公尺特法則,只與直接的朋友發生通訊,而subemployee類並不是companymanager類的直接朋友(以區域性變數出現的耦合不屬於直接朋友),從邏輯上講總公司只與他的分公司耦合就行了,與分公司的員工並沒有任何聯絡,這樣設計顯然是增加了不必要的耦合。按照迪公尺特法則,應該避免類中出現這樣非直接朋友關係的耦合。修改後的**如下:

class

subcompanymanager

return

list;

} public void printemployee()

} }

class

companymanager

return

list;

} public void printallemployee(subcompanymanager sub)

} }

修改後,為分公司增加了列印人員id的方法,總公司直接呼叫來列印,從而避免了與分公司的員工發生耦合。

迪公尺特法則的初衷是降低類之間的耦合,由於每個類都減少了不必要的依賴,因此的確可以降低耦合關係。但是凡事都有度,雖然可以避免與非直接的類通訊,但是要通訊,必然會通過乙個「中介」來發生聯絡,例如本例中,總公司就是通過分公司這個「中介」來與分公司的員工發生聯絡的。過分的使用迪公尺特原則,會產生大量這樣的中介和傳遞類,導致系統複雜度變大。所以在採用迪公尺特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合

設計模式 迪公尺特法則

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

設計模式 迪公尺特法則

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

設計模式 迪公尺特法則 Lod LKP

迪公尺特法則 law of demeter,lod 也稱最少知識原則 least knowledge principle,lkp 理解 如果兩個類不必彼此直接通訊,那麼這兩個類就不應該發生直接的相互作用。如果其中乙個類需要呼叫另乙個類的某乙個放發的話,可以通過第三者 這個呼叫。每個物件都必然會與其他...