Hide Delegate (隱藏「委託關係")

Summary: 

客戶經過一個委託來調用另外一個對象。在服務類上創建客戶所需的全部函數,用以隱藏委託關係。 java

Motivation:

「封裝」即便不是對象的最關鍵特徵,也是最關鍵特徵之一。「封裝」意味着每一個對象都應該儘量少了解系統的其餘部分。如此一來,一旦發生變化,須要瞭解這一變化的對象就會比較少—這會使變化比較容易進行。 函數

若是某個客戶先經過服務對象的字段獲得另外一個對象,而後調用後者的函數,那麼客戶就必須知曉這一層委託函數。萬一委託關係發生變化,客戶也得相應變化。咱們能夠在服務對象上放置一個簡單的委託函數,將委託關係隱藏起來,從而去除這種依賴。這麼一來,即使未來發生委託關係上的變化,變化也被限制在服務對象中,不會波及客戶。 測試

對於某些或所有客戶,可能有必要先使用Extract Class。一旦對全部客戶都隱藏了委託關係,就再也不須要在服務對象的接口中公開被委託對象了。 編碼

Mechanics:

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()了
相關文章
相關標籤/搜索