天天看點

迪米特法則(Law of Demeter) 簡介

在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) 簡介

三,小結

上面的那個例子是符合law of demeter的

它有什麼優點呢.

就是當我們修改supportMM的内容時,  customer并不會受到任何影響.

也就是 松耦合的好處.

其實所有設計模式的目的無非兩點:

1. 另業務思路更加清晰

2. 便于修改和擴充

繼續閱讀