【びじたーぱたーん】

Visitorパターン とは?

最終更新:
💡 同じ要素に、別の訪問者で新しい処理

データ構造の要素と、それに適用する操作を分けるデザインパターン。要素がVisitorを受け入れる仕組みを用意すると、新しい操作を別のVisitorとして追加しやすくなる。

📌 このページのポイント
要素と、適用する操作を分ける 要素 File / Folder Visitorの例 容量の計算 別の操作 ① accept ② visitFile等 acceptから、その要素の処理を呼ぶ 要素の種類が増えれば、対応も必要
呼び出し側が要素のacceptにVisitorを渡し、要素が型に対応するVisitorの処理を呼ぶ。線は呼び出しの方向を示す概念図。
ひよこ ひよこ
Visitorは何を訪問するの?
ペンギン先生 ペンギン先生
データ構造の要素だよ。たとえばファイルとフォルダに対する容量計算を、一つのVisitorにまとめる例が考えられる。同じ要素に別の操作を適用したいときは、別のVisitorを用意できるんだ。
ひよこ ひよこ
要素のクラスは一度も変更しなくていい?
ペンギン先生 ペンギン先生
最初にVisitorを受け入れるacceptなどの仕組みが必要だよ。その仕組みと必要なデータへのアクセスがそろっていれば、操作を増やすたびに要素のクラスへ処理を追加する手間を減らせる。導入や動作確認まで不要になるわけではないんだ。
ひよこ ひよこ
acceptとvisitは、どちらが呼ぶの?
ペンギン先生 ペンギン先生
呼び出し側が要素のaccept(visitor)を呼び、要素がVisitorの型に対応した処理を呼ぶよ。たとえばFile.acceptはvisitor.visitFile(this)へ渡す。このように、要素とVisitorの両方に応じて処理を選ぶ仕組みをダブルディスパッチと説明するんだ。
ひよこ ひよこ
要素の種類が増えても便利?
ペンギン先生 ペンギン先生
操作を増やすのは得意だけれど、新しい種類の要素を追加すると、その種類を扱う処理もVisitor側へ用意する必要があるよ。デフォルト処理で影響を抑える実装もある。要素の種類が安定し、操作が増える場面で使いやすい設計なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Visitorパターン」って出てきたら「要素と操作を分け、訪問者として処理を追加する設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Visitor Pattern」 = 訪問者パターン
💬 visitor は「訪問者」という意味で、データ構造の各要素を「訪問」しながら処理を行う外部のオブジェクト(訪問者)という比喩から名付けられたんだよ。

参考資料

← 用語集にもどる