1. 程式人生 > >重構改善既有代碼設計--重構手法14:Hide Delegate (隱藏委托關系)

重構改善既有代碼設計--重構手法14:Hide Delegate (隱藏委托關系)

nag 其他 耦合 pan manager 容易 -- 暴露 現在

客戶通過一個委托類來調用另一個對象。
在服務類上建立客戶所需的所有函數,用以隱藏委托關系。

動機:
封裝即使不是對象的最關機特性,也是最關機特性之一。“封裝”意味著每個對象都應該少了解系統的其他部分。如此以來,一旦發生變化,需要了解這一變化的就比較少---這會使系統比較容易進行。

任何學過對象技術的人都知道:雖然Java將字段聲明為public,但你還是應該隱藏對象的字段。隨著經驗日漸豐富,你會發現,有更多可以(值得)封裝的東西。
如果某個客戶需要通過服務對象的字段得到另一個對象,然後調用後者的函數,那麽客戶就必須知曉這一層委托關系。萬一委托關系發生變化,那麽客戶也得相應變化。你可以在服務對象上放置一個簡單的委托函數,將委托關系隱藏起來,從而去除這種依賴。這麽以來即使將來發生魏國關系上的變化,變化也將被限制在服務對象中,不會波及客戶。

範例:
本例從兩個類開始:代表“人”的Person類和代表“部門”的Department類。
class Person{
Department _department;
public Department getDepartment(){
reutrn _department;
}
public void setDepartment(Department department){
_department=department;
}
}

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,可以減少耦合。為了這一目的,
可以在Person類中建立一個簡單的委托函數:

public Person getManager(){
return _department.getManager();
}
現在,修改Person的所有客戶,讓他們改用新函數:
manager=john.getManager();
只要完成了對Department所有函數的委托關系,並修改了相應Person的所有客戶,那麽就可以移除Person中的訪問函數getDepartment()了。

重構改善既有代碼設計--重構手法14:Hide Delegate (隱藏委托關系)