Visitor パターン
Visitor パターンは、オブジェクトの構造に繰り返しをどのように行うかを指定する。最も簡単な場合、各アルゴリズムが繰り返しを全く同じように行う場合、コンテナ要素の accept() メソッドは、visitor の visit() メソッドをコールバックするだけではなく、visitor オブジェクトを 全ての子要素の accept() メソッドに渡す。
Visitor オブジェクトは主たる関数(複数の特化したメソッドで明示されている)を一つ持ち、その関数は visit() と呼ばれる。それゆえ、Visitor は関数オブジェクトやファンクタとして捉えることも容易である。同様に、 accept() 関数は、特定の型のオブジェクトを順次走査して各要素に関数を適用する方法を知っている利用者、マッパーである。Common Lisp は 多重ディスパッチをサポートする数少ないオブジェクト指向システムではあるが、上記の例の最初の部分は多重ディスパッチに依存しない。多重ディスパッチを備えた Lisp のオブジェクトシステムは Visitor パターンを置き換えるものではなく、パターンそのものを残したより簡潔な実装を提供するのみである。
Visitor パターンの基本的な考えとして、visitor を引数として受け取る accept() メソッドを持ったクラスを複数、要素として持つ構造をとる。Visitor は各要素クラスごとにaccept() メソッドを持つインタフェース である。特定の処理を実行する個別の具体的なvisitor クラスを作成することができる。具体的な visitor の visit() メソッドは、一つのクラスのメソッドとして考えるものではなく、二つのクラスのペア、すなわち具体的な visitor と特定の要素クラスに対するメソッドとして考えることができる。それゆえ、Visitor パターンは ダブルディスパッチ を従来の Java、Smalltalk、C++ などのオブジェクト指向プログラミング言語で模したものである。ダブルディスパッチと関数のオーバーロードとの違いについては、en:Double dispatch#Double dispatch is more than function overloadingの記事を参照のこと。Java 言語でリフレクションを用いて Visitor パターンにおけるダブルディスパッチを模倣する機構を簡潔にする二つのテクニックが文書として公開されている( getting rid of accept() methods (Walkabout の派生形)および getting rid of extra visit() methods )。