Triple Dispatch Visitor

サンプル

これは僕が勝手に名前をつけただけなんで、もしかしたら他の人も同じようなことを考えて別の名前をつけてるかも。

Composite+Visitorパターンを使っていると、Compositeツリー内を移動するコードをよくVisitorのvisitメソッドに記述します。ツリー構造の上から下まで全部なめる、というようなことを僕はよくやるのですけど、そのたびにVisitorに移動するコードを記述するのは面倒です。Concrete Visitorの移動の部分だけを実装したAbstract Visitorを作ったりしたこともありますが、全然エレガントじゃないです。

で、最近やっとこの解を思いつきました。


まず、Visitorをインタフェースとして作っておいて、移動する部分のVisitorはVisitorのDecoratorとして作成します。で、あとはConcrete Visitorを移動のコードを記述せずに書いてあげると。


で、通常のVisitorはDouble Dispatchしていますが、この場合には移動用のVisitorがさらにDispatchしてますので、Triple Dispatch Visitorと名づけましたわけです。


個人的には気に入ってるんですけどね。デザインパターンを勉強している人には複雑すぎるかも。いや、それ以上にそもそもこれでイメージ伝わるかな?一応クラス図をつけてみます。