Visitorパターン - 複雑な構造への操作

オブジェクト構造に操作を定義するVisitorパターンを学びましょう。AST処理、ドキュメントエクスポート、レポート生成のTypeScript実装例。

Behavioral

詳細な説明

Visitorパターン

Visitorパターンは、操作対象の要素のクラスを変更せずに、既存のオブジェクト構造に新しい操作を追加できます。要素がビジターを受け入れ、ビジターが各要素型に対する特定のメソッドを持つダブルディスパッチによってこれを実現します。

ダブルディスパッチ

シングルディスパッチ(通常のメソッド呼び出し)では、呼び出されるメソッドは1つのオブジェクトの実行時型に依存します。Visitorは2つのオブジェクトの型に操作が依存するダブルディスパッチを実装します:要素とビジター。

Visitorが優れている場面

Visitorは、要素の階層が安定しており(新しい要素型はめったに追加しない)、新しい操作を頻繁に追加する場合に輝きます。コンパイラAST処理が典型例です:ノード型(式、文、宣言)は固定ですが、新しい分析パスを常に追加します。

避けるべき場面

新しい要素型を頻繁に追加する場合、新しい型ごとにすべてのビジターにメソッドを追加する必要があります。これが基本的なトレードオフです。頻繁に変更される要素階層には、代わりにStrategyパターンを検討しましょう。

状態の蓄積

ビジターは要素をトラバースしながら結果を蓄積できるため、ノード数のカウント、値の合計、統計の収集、出力の生成などの集約操作に最適です。

ユースケース

Visitorは、コンパイラAST処理(型チェック、最適化、コード生成を別々のビジターとして)、ドキュメントフォーマットエクスポーター(同じドキュメントモデルからHTML、Markdown、PDF)、同じデータに対して異なるメトリクスを計算するレポートジェネレータ、シリアライゼーションシステムに不可欠です。

試してみる — Design Pattern Reference

フルツールを開く