條件滿足:
1 當前對象本身(this)
2 以參量形式傳入到當前對象方法中的對象
3 當前對象的實例變量直接引用的對象
4 當前對象的實例變量如果是一個聚集,那么聚集中的元素也都是朋友
5 當前對象所創(chuàng)建的對象
否則就不算"朋友" 代碼需優(yōu)化重構(gòu)
不是“朋友”的例子:
public class SomeOne
{
public void operation(Friend friend)
{
Stranger stranger = friend.getStranger();
stranger.operation();
}
}
friend是SomeOne的朋友,但是在operation內(nèi)部出現(xiàn)了stranger對象,它不是SomeOne的朋友,stranger.operation()方法應(yīng)該挪到friend對象內(nèi)部去,進行封裝再對SomeOne提供。
這原則就是迪米特法則。
優(yōu)點:降低系統(tǒng)內(nèi)部的耦合度,若修改僅僅只會影響到這個類的“朋友”們,而不會影響到當前對象。
缺點:對象里會產(chǎn)生大量的小方法,這些方法僅僅只是傳遞間接的調(diào)用,因此與系統(tǒng)的業(yè)務(wù)邏輯無關(guān),一個小方法內(nèi),可能僅僅只是調(diào)用了關(guān)聯(lián)對象的其它方法,而且會使系統(tǒng)的不同模塊之間不容易協(xié)調(diào)。
避免該缺點:使用依賴倒置原則,比如把上面的stranger做為抽象類,stranger.operation()是個抽象方法,通過friend.getStranger()動態(tài)返回不同具體的類,這樣仍然做到了SomeOne對象不用修改,要改也只是friend.getStranger()方法內(nèi)部返回不同的子對象即可,但是為了代碼整潔度,清晰明了,直接一個friend.operation(),感覺還是挪走比較好。
23種模式里面:門面模式與中介者模式就是迪米特法則的應(yīng)用
門面模式示意圖: 顯然Facade依賴各個子系統(tǒng),子系統(tǒng)可以有多個,客戶端直接與Facade打交道

中介者模式示意圖: