さて、すべての訪問者を拡張する必要があります。
呼び出し元、訪問する必要があるいくつかの要素、および個々の要素の処理を行う要素 (訪問者) があります。あなたの目標は、要素の実装と呼び出し元を固定し、新しい訪問者によって機能を拡張することです。
通常、具体的な訪問者がたくさんいます。処理する新しいタイプの要素を追加する場合は、これを考慮してすべての具体的な訪問者を変更する必要があります。
なんで?
呼び出し元が "Factory" で、"Car" と "Bike" という要素があるとします。
操作「ペイント」には、メソッドが必要です
void process(Car c); // Paint a car
void process(Bike b); // Paint a bike
「組み立てる」「梱包する」「洗う」などの作業も同様です。
要素「Scooter」を追加すると、すべての操作を新しいメソッドで拡張する必要があります
void process(Scooter s); // Handle a Scooter
これはちょっとした作業です。また、追加する要素が他の要素と大きく異なり、操作に簡単に適合させることができないという問題に遭遇することもあります。
ウィキペディア (http://en.wikipedia.org/wiki/Visitor_pattern) によると
本質的に、ビジターを使用すると、クラス自体を変更することなく、クラスのファミリーに新しい仮想関数を追加できます。代わりに、仮想関数の適切な特殊化をすべて実装するビジター クラスを作成します。ビジターはインスタンス参照を入力として受け取り、二重ディスパッチによって目標を実装します。
これは、私が上で言おうとしていることをかなり抽象的な言い方で表現したものです。通常、これらのメソッドを要素に追加しますが、それができない場合は、メソッドを別のものに追加し、それを渡して処理を行う必要があります。これは少し余分な作業ですが、状況に応じて行う価値があるかもしれません。