訪問者の定義:特定のオブジェクトグループの各オブジェクトに作用する操作。これにより、これらのオブジェクトを変更せずにこれらのオブジェクトに作用する新しい操作を定義できます。
Javaでは、訪問者パターンは実際にコレクション構造の要素とこれらの要素を動作させる動作を分離します。
訪問者モードを使用する理由
Javaコレクション(VectorとHashtableを含む)は、最も頻繁に使用する技術ですが、コレクションはさまざまな種類のオブジェクトが入力されてから外出すると、大きな黒い染色VATのようです。次に、次のように判断する場合は使用する必要があります。
コードコピーは次のとおりです。
iterator iterator = collection.iterator()
while(iterator.hasnext()){
オブジェクトo = iterator.next();
if(o instanceof collection)
sksyprintCollection((collection)o);
else if(o instanceof string)
System.out.println( "'"+o.toString()+"'");
else if(o instanceof float)
System.out.println(o.toString()+"f");
それ以外
system.out.println(o.toString());
}
上記の例では、ofのタイプを決定するためにIntanceOfを使用しました。
明らかに、コードが面倒である場合、これを行うことの欠点は、ビジターモードを使用して解決できます。
訪問者モードの使用方法
上記の例では、インターフェイス訪問者の訪問者を設計します。
コードコピーは次のとおりです。
パブリックインターフェイス訪問者
{
public void visitCollection(コレクションコレクション);
public void visitstring(string string);
public void visitfloat(float float);
}
このインターフェースでは、クラスの種類を配置して、コレクションが可能だと思います。
訪問者は、訪問者がこれらの要素にアクセスできるインターフェイスを定義する必要があります(アクセスとアクセスがアクセスする必要があります。彼を歓迎しません、訪問者は訪問することができません)。
このインターフェイスを訪問可能であると定義します。これは、受け入れ操作を定義するためです。つまり、コレクションの各要素をアクセス可能にします。
コードコピーは次のとおりです。
パブリックインターフェイス訪問可能{
Public void Accept(訪問者訪問者);
}
OK、2つのインターフェイスを使用して、特定の実装(コンクリートクラス)を定義する必要があります。
コードコピーは次のとおりです。
パブリッククラスのコンクリートエレメントは、訪問可能な実装を実装しています
{
プライベート文字列値。
Public ConcreteElement(String String){
value = string;
}
//ここに受け入れる特定のコンテンツを定義するパブリックボイドを呼び出すための非常に簡単な文(訪問者訪問者){{
visitor.visitstring(this);
}
}
訪問者の具体的な実装を見てみましょう。
コードコピーは次のとおりです。
パブリッククラスのコンクリートビジターは訪問者を実装します
{
//この方法では、コレクションの要素への成功したアクセスを公開void visitCollection(コレクションコレクション){
iterator iterator = collection.iterator()
while(iterator.hasnext()){
オブジェクトo = iterator.next();
if(o訪問可能なインスタンス)
((訪問可能)o).accept(this);
}
public void visitstring(string string){
system.out.println( "'"+string+"'");
}
public void visitfloat(float float){
System.out.println(float.toString()+"f");
}
}
上記のVisitCollectionでは、1つの判断ステートメントのみを使用して、コレクションの各要素へのアクセスを実装して、アクセス可能かどうかを判断します。
この時点で、訪問者モデルの基本的なアーキテクチャを完了しました。
訪問者モードを使用するための前提条件
オブジェクトグループ構造のオブジェクトタイプはめったに変更されません。つまり、上記の例のように、新しい操作が必要な場合、上記の訪問者のタイプが変更されることはめったにないように、訪問者の識別タイプがめったに変更されません。 ConcreteElement固有の実装に加えて、新しいconcreteElement2 concreteElement3も必要です。
訪問者モードを使用するための前提条件があり、訪問者がほとんど変更されておらず、変更が訪問可能であることを確認してください。
訪問者も頻繁に変更される場合、つまりオブジェクトグループのオブジェクトタイプがしばしば変更される場合、一般的な提案は、これらのオブジェクトクラスで操作を1つずつ定義する方が良いということですが、Javaの反射テクノロジーはこの問題を解決します。