【びじたーぱたーん】

Visitorパターン とは?

💡 「家の構造を変えずに、掃除も配達も好きな作業ができる」訪問者の設計術。
📌 このページのポイント
Visitorパターン データ構造(Element) File.accept(visitor) Folder.accept(visitor) 変更不要(クローズド) 処理(Visitor) SizeCalcVisitor VirusScanVisitor 追加自由(オープン) accept(v) v.visit(this) ダブル ディスパッチ 既存クラスを変えずに新しい操作(Visitor)を追加できる 活用例: コンパイラのAST処理(型チェック / 最適化 / コード生成) 処理の種類が増えやすい設計に最適
データ構造とアルゴリズムを分離するVisitorパターン
ひよこ ひよこ

Visitorパターンって、訪問者ってどういう意味なの?

ペンギン先生 ペンギン先生

データ構造の各要素を「訪問」して回る外部のオブジェクトを「Visitor(訪問者)」と呼ぶんだ。たとえばファイルシステムのフォルダ・ファイルという構造に対して、「容量合計を計算するVisitor」「ウイルススキャンするVisitor」など処理を別々に追加できるよ。

ひよこ ひよこ

それって普通にメソッドを追加するのと何が違うの?

ペンギン先生 ペンギン先生

既存のクラスに手を加えなくて済むのが最大の違いだよ。ファイルやフォルダクラスに新しいメソッドを追加するのではなく、新しい Visitor クラスを作るだけでいいんだ。既存コードを変更するリスクがないのが大きなメリットだよ。

ひよこ ひよこ

どうやって動くの? 仕組みが気になるな。

ペンギン先生 ペンギン先生

各要素クラスに `accept(visitor)` というメソッドを持たせるんだ。要素は呼ばれたら `visitor.visit(this)` と自分を渡す。Visitorは各要素の型ごとに `visit` メソッドを用意しておいて、ダブルディスパッチと呼ばれる仕組みで型に合った処理が呼ばれるよ。

ひよこ ひよこ

向いてる場面と向いてない場面ってあるの?

ペンギン先生 ペンギン先生

処理の種類が増えやすいプロジェクトに向いているよ。コンパイラの構文木(AST)への型チェック・最適化・コード生成などの適用が典型例だね。一方で要素の種類(クラス)が増えると、既存の全Visitorに新しい `visit` メソッドを追加しなければならないから、そういう場合は苦手なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Visitorパターン」って出てきたら「構造を変えずに新処理を追加する設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Visitor Pattern」 = 訪問者パターン
💬 visitor は「訪問者」という意味で、データ構造の各要素を「訪問」しながら処理を行う外部のオブジェクト(訪問者)という比喩から名付けられたんだよ。
← 用語集にもどる