客戶經過一個委託來調用另外一個對象。在服務類上創建客戶所需的全部函數,用以隱藏委託關係。 java
「封裝」即便不是對象的最關鍵特徵,也是最關鍵特徵之一。「封裝」意味着每一個對象都應該儘量少了解系統的其餘部分。如此一來,一旦發生變化,須要瞭解這一變化的對象就會比較少—這會使變化比較容易進行。 函數
若是某個客戶先經過服務對象的字段獲得另外一個對象,而後調用後者的函數,那麼客戶就必須知曉這一層委託函數。萬一委託關係發生變化,客戶也得相應變化。咱們能夠在服務對象上放置一個簡單的委託函數,將委託關係隱藏起來,從而去除這種依賴。這麼一來,即使未來發生委託關係上的變化,變化也被限制在服務對象中,不會波及客戶。 測試
對於某些或所有客戶,可能有必要先使用Extract Class。一旦對全部客戶都隱藏了委託關係,就再也不須要在服務對象的接口中公開被委託對象了。 編碼
1.對於每個委託關係中的函數,在服務對象端創建一個簡單的委託函數。 spa
2.調整客戶,令它只調用服務對象提供的函數。 code
若是使用者和服務提供者不在同一個包,考慮修改委託函數的訪問權限,讓客戶得以在包以外調用它。 對象
3.每次調整後,編譯並測試。 接口
4.若是未來再也不有客戶須要取用Delegate(受託類),即可移除服務對象中的相關訪問函數。 get
5.編譯,測試。 io
從兩個類開始:表明「人」的Person和表明「部門」的Department:
public class Person { Department department; public Department getDepartment() { return department; } public void setDepartment( Department arg ) { department = arg; } }
public class Department { private String chargeCode; private Person manager; public Department( Person person ) { manager = person; } 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()了