天天看點

Hide Delegate(隐藏委托關系)

 客戶直接調用其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()了。