あるクラスが別のクラスを利用しているときに、その利用しているクラス内にある委譲クラスも利用しているような場合がある。
public class Server { Delegate delegate; ... Delegate getDelegate() { return delegate; } ... } public class Delegate { void func() { ... } } public class Client { Server server; ... void test() { server.getDelegate().func(); } }
ClientクラスはServerクラス内の委譲クラスであるDelegateクラスをgetDelegateメソッドで取得して利用している。このような場合だとClientクラスはServerクラスとDelegateクラスの両方に依存してしまっている。この委譲を隠蔽することによってClientクラスはServerクラスだけに依存するようにする。
手順
- 委譲クラスのメソッドに対応する委譲メソッドをサーバクラスに作成
- クライアントクラスは委譲クラスからサーバクラスを利用するように変更
コンパイルしてテスト。
- サーバクラスにある委譲クラスのgetterメソッドを削除
コンパイルして確認。
public class Server { Delegate delegate; ... void func() { delegate.func(); } ... } public class Delegate { void func() { ... } } public class Client { Server server; ... void test() { server.func(); } }
もし、上の例でServerクラスのメソッドが委譲クラスだけになってしまった場合は、Serverクラスが必要ないかもしれない。ただ仲介人の役をしているだけなのかも。そのような場合はServerクラスを使うことをやめ、Delegateクラスを直接利用するように変更すべきかもしれない。これをリファクタリングで「仲介人の除去(Remove Middle Man)」という。委譲を隠すほうがよいのか仲介人の除去をおこなうほうがいいのかはケース・バイ・ケース。