Proxyパターン
使いどころ
- オブジェクトに対する操作の間に何らかの操作を挟み込みたいとき
- 間に挟み込まれている処理に関する詳細を、対象のオブジェクトとそれを操作するオブジェクト隠蔽したいとき
構造
商品を表すItemを考える。ItemImplはItemそのものを表すクラスである。ItemProxyは、Itemインターフェースを実装していて、ItemImplに対する参照を持つ。
例
DBアクセスするItemProxyを、ItemImplと同じインターフェースを提供する状態にして定義する。 こうすることで、ItemImplはDBアクセスについて何も知らない状態を作れる。
何が嬉しいのか
- Proxyが行っている処理を、Itemから完全に分離できる。いわゆるビジネスロジックが、データの永続化に関わるロジックの影響を受けない。
- Proxyを入れ替えるだけで異なる処理を挟み込める。例えば、DBアクセスによるデータ取得をAPI取得によるものに変更する場合もProxyを入れ替えるだけで良い。
注意点
- Proxyを常にItemに追従させないといけないので実装はけっこう面倒
- データアクセスをともなうなどの処理が、本当に普通のオブジェクトと全く同じインターフェースできれいに実装できるのかは怪しい
- 単にデータベースにアクセスしたいだけなら、少しやりすぎな感はある。ビジネスロジックに多少侵食していいなら、データアクセスオブジェクトをコールするなどもう少し単純なやり方がある。