某集團公司包含總公司與分公司,需打印所有下屬單位員工 ID。初版設計直接在總公司管理類中遍歷分公司員工列表,違反迪米特法則。
class CompanyManager {
public void printAllEmployee(SubCompanyManager sub) {
// 直接訪問陌生類 SubEmployee,耦合度極高
List<SubEmployee> list1 = sub.getAllEmployee();
for (SubEmployee e : list1) System.out.println(e.getId());
// ...
}
}
問題:CompanyManager 與 SubEmployee 無直接關聯(非成員變量/參數/返回值),屬「陌生類」。分公司員工變動會波及總公司代碼。
核心思想:只與直接朋友通訊。總公司只認識分公司管理類,由分公司負責打印本單位員工。
class SubCompanyManager {
// 新增:封裝打印邏輯
public void printEmployee() {
List<SubEmployee> list = this.getAllEmployee();
for (SubEmployee e : list) System.out.println(e.getId());
}
}
class CompanyManager {
public void printAllEmployee(SubCompanyManager sub) {
sub.printEmployee(); // 委託直接朋友處理
List<Employee> list2 = this.getAllEmployee();
for (Employee e : list2) System.out.println(e.getId());
}
}
迪米特法則本質是封裝變化、降低耦合。通過「中介者」轉發請求,雖增加間接層,但換來系統穩定性與可維護性的提升。實戰中需警惕「為模式而模式」,以業務邊界為準繩劃分直接朋友圈。