迪公尺特原則(law of demeter lod)
迪公尺特原則又叫最少知道原則(least knowledge principle,lkp)
,這裡的最少知道主要是強調,呼叫者對傳入的引數,和接受到的返回的引數很熟悉即可,不需要知道在呼叫過程中涉及了哪些框架設計者自己的類。
例如你使用某個json
框架,你傳入的是可能是乙個物件
,最多再傳入了乙個class型別
就可以很方便的呼叫這個框架的方法,接受到了的也是已經被序列化好的json字串
,這些都是我們熟悉的,但是如果你要我傳入乙個這個json框架
自己為了開發方便而定義的類,並且讓我例項化作為引數,又或者作為返回值接收,我是無從下手的。這樣作為呼叫者來說體驗不是很好,所以迪公尺特原則強調的是,呼叫者最好只是需要知道他們熟悉的東西就可以了,無需知道更多
。
還是舉例子飯店的例子,天天去吃飯,我們最熟悉的是當然是服務員(waiter
),我們就只需要知道這乙個角色就可以了,點餐和結賬只需要找他就可以,著很方便。
我們點餐後,服務員自己會去找他熟悉的廚師,又或者經理去安排接下來的工作。
所以,我們對飯店只需要知道乙個服務員即可,這是最少知道的體現。
public
class
pop}
public
class
waiter
}
呼叫的時候。
public
static
void
main
(string[
] ars)
當我們呼叫的時候,只傳入了我們所熟悉的服務員(waiter),因為我們天天去,當然最熟悉,然後天天點這家的菜,自然對這家有什麼菜也爛熟於心。
我們也最少知道
這些知識,就可以吃到我們想要的東西。我們對後面做菜的廚師(cook
)並不知道也不熟悉,我們吃個飯也不用每個廚師都認識吧,這也不合邏輯。
合成復用原則(composite/aggregate reuse principle,carp)
這個原則其實我們天天都在用,就是讓你的類持有乙個其他成員變數,為什麼要這樣的做?
我認為
,這是除了使用內部類來實現多重繼承
的另一種方法,這個繼承其實還是要打上雙引號,因為這個和繼承還是有更加本質的區別。
我們可以往乙個類中塞入很多其他類成員來使用他們的方法,就彷彿
是繼承了他們,可是就繼承來說,父類的細節是完全暴露給子類的,我們把他叫做白箱復用
,而通過合成/復用的方法,我們對類以外的物件是無法獲得實現細節,其實我們對於這個陌生的父類
只是單純呼叫他的方法而已,我們把它叫做黑箱復用
。
這個就不做**演示了。大家平時肯定都用到,只是沒有這個方面的意識而已。
迪公尺特原則
也就是說類盡量不要對外公開public方法,和非靜態的public變數,多使用private和protected訪問許可權。迪公尺特原則的核心就是類的解耦和,只有耦合越低,類的復用性才能提高,但是過分使用迪公尺特原則,會大量產生中介類,導致系統變複雜,對維護增加困難。迪公尺特原則強調只和朋友交流,不...
設計模式 迪公尺特原則 開閉原則
乙個物件應該對其他物件有最少的了解。通俗地講,乙個類應該對自己需要耦合或呼叫的類知道得最少,你 被耦合或呼叫的類 的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的這麼多public方法,我就呼叫這麼多,其他的我一概不關心。每個物件都必然會與其他物件有耦合關係,兩個物件之間的耦合就成為朋友...
五 迪公尺特原則
定義 乙個物件應該對其他物件保持最少的了解。又叫最少知道原則 盡量降低類與類之間的耦合 強調只和朋友交流,不和陌生人說話 朋友 出現在成員變數 方法的輸入 輸出引數中的類稱為成員朋友類,而出現在方法體內部的類不屬於朋友類。優點 降低類之間的耦合 假設場景 老闆需要知道某個領導下面有多少員工,只需要知...