客戶直接調用其server object(服務對象)的delegate class。
在server端(某個class)建立客戶所需的所有函數,用以隐藏委托關系(delegation)。
Client--〉Person
|
|
Department
==〉
Client --〉Person--〉Department
動機
如果某個客戶調用了[建立了server object(服務對象)的某個值域基礎之上]的函數,那麼客戶就必須知曉這一委托對象(delegate object)。萬一委托關系發生變化,客戶也得相應變化。你可以在server端放置一個簡單的委托函數(delegating method),将委托關系隐藏起來,進而去除這種依存性。這麼一來即便将來發生關系上的變化,變化将被限制在server中,不會涉及客戶。
作法
1. 對于每一個委托關系中的函數,在server端建立一個簡單的委托函數(delegating method)。
2. 調整客戶,令它隻調用server提供的函數(不得跳過徑自調用下層)。
3. 如果client(客戶)和server不在同一個package,考慮修改委托函數(delegating method)的通路權限,讓client得以在package之外調用它。
4. 每次調整後,編譯并測試。
5. 如果将來不再有任何客戶需要取用圖的Delegate(委托類),便可移除server中的相關通路函數(accessor for the delegate)。
6. 編譯,測試。
本例從兩個classes開始,代表[人]的Person和代表[部門]的Department:
class Person {
Department _department;
public Department getDepartment() {
return _department;
}
public void setDepartment(Department arg) {
_department = arg;
}
}
class Department {
private String _chargeCode;
private Person _manager;
public Department(Person manager) {
_manager = manager;
}
public Person getManager() {
return _manager;
}
...
如果客戶希望知道某人的經理是誰,他必須先取得Department對象:
manager = john.getDepartment().getManager();
這樣的編碼就是對客戶揭露了Department工作原理,于是客戶知道:Department用以追蹤[經理]這條資訊。如果對客戶隐藏Department,可以減少耦合(coupling)。為了這一目的,我在Person中建立一個簡單的委托函數:
public Person getManager() {
return _department.getManager();
}
現在,我得修改Person的所有客戶,讓它們改用新函數:
manager = john.getManager();
隻要完成了對Department所有函數的委托關系,并相應修改了 Person的所有客戶,我就可以移除Person中的通路函數個體Department()了。