在Java裡class設計經常會提到一些個原則或者規則
最出名的莫非是 封閉-開放原則了(closed-open principle)
而這次這個 Law of Demeter 也是挺重要的.
一, 迪米特法則(Law of Demeter)的定義
迪米特法則(Law of Demeter)又叫作最少知識原則(Least Knowledge Principle 簡寫LKP),就是說一個對象應當對其他對象有盡可能少的了解,不和陌生人說話。英文簡寫為: LoD.
解釋:
通常隻看定義是不能了解的...
我們可以把這個法則分拆性兩點.
1. 類設計中, 盡量降低成員的通路權限(最低是Private)
2. 類A 假如 不認識 類B, 那麼類B不能直接通路類A的方法.
3. 假如類B要通路類A, 那麼類B可以借組 第三個類C來實作, ( 類C是類A認識的類).
二,一個例子
例如我們可以找聯通客服mm來查詢手機月費資訊.
但是我們不能直接找聯通的客服人員, 因為我們沒有聯通客服的私人号碼.
這樣則說明, 聯通客服人員的服務方法不是Public的, 一般人不能直接通路.
SupportMM: 位于service包内
package lawOfDemeter.service;
import lawOfDemeter.Customer;
public class SupportMM {
private String name;
protected SupportMM(String name){
this.name = name;
}
protected void service(Customer c){
System.out.println("Hello i am " + this.name);
}
}
可見她的構造函數和service方法都是包内通路的.
CustomerService: 位于service包内
這個是客服類.
客服類與客服MM類處于同1個包内,
客服類有個查找空閑mm的方法, 并且讓空閑的mm去接客.
但是客服的service方法是對外的(public)
也就說所有客戶都可以直接通路客服.
package lawOfDemeter.service;
import lawOfDemeter.Customer;
public class CustomerService {
public static void service(Customer c){
getFreeSupport().service(c);
}
private static SupportMM getFreeSupport(){
return new SupportMM("Inne"); // just a sample
}
}
Customer: 位于service包外
由于在包外, 是以Customer是不能直接通路SupportMM的
package lawOfDemeter;
import lawOfDemeter.service.*;
public class Customer {
public void askHelp(){
CustomerService.service(this);
}
}
但是它可以通過客服來間接獲得supportMM的服務.
UML:

三,小結
上面的那個例子是符合law of demeter的
它有什麼優點呢.
就是當我們修改supportMM的内容時, customer并不會受到任何影響.
也就是 松耦合的好處.
其實所有設計模式的目的無非兩點:
1. 另業務思路更加清晰
2. 便于修改和擴充