Visitor は、 振る舞いに関するデザインパターンの一つで、 既存コードを変更することなく、 既存のクラス階層に新しい振る舞いの追加を可能とします。
Visitor の代わりに単純にメソッドの多重定義 (overload) を使うことができない理由については、 別の記事 『ビジターと二重ディスパッチ』 を参照。
複雑度:
人気度:
使用例: Visitor は、 その複雑さと狭い適用範囲のため、 あまりよく使われません。
Java のコア・ライブラリーでのこのパターンの使用例です:
図形の XML エクスポート
この例では、 幾何学的図形を XML にエキスポートしたいと思っています。 ただ、 図形のコードはできたら触りたくありません。 少なくとも変更は最小に抑えたいと思っています。
結局のところ、 Visitor パターンを使うことにより、 図形の階層に、 クラスの既存コードを変更することなく任意の振る舞いを追加する仕組みを作り上げることができます。
shapes
shapes/Shape.java: 共通図形インターフェース
shapes/Dot.java: 点
shapes/Circle.java: 円
shapes/Rectangle.java: 四角形
shapes/CompoundShape.java: 複合図形
visitor
visitor/Visitor.java: 共通ビジター・インターフェース
visitor/XMLExportVisitor.java: 全図形を XML にエクスポートする具象ビジター
Demo.java: クライアント・コード
OutputDemo.txt: 実行結果