방문자 정의 : 특정 객체 그룹에서 각 객체에 작용하는 작업. 이를 통해 이러한 물체를 직접 변경하지 않고 수행하는 새로운 작업을 정의 할 수 있습니다.
Java에서 방문자 패턴은 실제로 수집 구조의 요소와 이러한 요소에서 작동하는 동작을 분리합니다.
방문자 모드를 사용하는 이유
Java Collection (Vector and Hashtable 포함)은 우리가 가장 자주 사용하는 기술이지만, 컬렉션은 다양한 독특한 유형의 물체를 넣고 꺼내면 이러한 유형이 사라지는 것처럼 보입니다. 그런 다음 다음과 같은 판단에 사용해야합니다.
코드 사본은 다음과 같습니다.
반복자 iterator = collection.iterator ()
while (iterator.hasnext ()) {
Object o = iterator.next ();
if (o 인스턴스 컬렉션)
MessyPrintCollection ((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 ());
}
위의 예에서는 인스턴스를 사용하여 O의 유형을 결정했습니다.
분명히 코드가 번거 롭다면 다른 일을 수행하는 단점은 방문자 모드를 사용하여 해결할 수 있습니다.
방문자 모드를 사용하는 방법
위의 예에서는 인터페이스 방문자 방문자를 설계합니다.
코드 사본은 다음과 같습니다.
공개 인터페이스 방문자
{
공개 void visoncollection (컬렉션 컬렉션);
공개 void visitstring (문자열 문자열);
공개 void visitfloat (float float);
}
이 인터페이스에서는 컬렉션이 가능하다고 생각하는 클래스 유형을 넣으십시오.
방문자를 사용하면 방문자가 컬렉션의 각 요소입니다. 그를 환영하지 않으면 방문자는 방문 할 수 없습니다).
이 인터페이스를 방문 가능한 것으로 정의합니다.이 인터페이스는 수락 작업을 정의하는 것, 즉 컬렉션의 각 요소를 액세스 할 수있게합니다.
코드 사본은 다음과 같습니다.
공개 인터페이스 방문 가능 {
공개 공허 수락 (방문자 방문자);
}
자, 두 개의 인터페이스를 사용하면 특정 구현 (콘크리트 클래스)을 정의해야합니다.
코드 사본은 다음과 같습니다.
공공 수업 콘크리트 규정은 방문 할 수 있습니다
{
개인 문자열 값;
공개 구체적 규모 (문자열 문자열) {
값 = 문자열;
}
// 수락의 특정 내용을 정의합니다.
Visitor.visitstring (this);
}
}
방문자의 구체적인 구현을 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
공개 클래스 Concretevesitor는 방문자를 구현합니다
{
//이 방법에서는 컬렉션의 요소에 대한 성공적인 액세스를 공개 void visitCollection (Collection Collection) {
반복자 iterator = collection.iterator ()
while (iterator.hasnext ()) {
Object o = iterator.next ();
if (o 방문 가능)
((방문 가능한) o) .crect (this);
}
public void visitstring (문자열 문자열) {
System.out.println ( "" "+String+" ' ");
}
공개 void visitfloat (float float) {
System.out.println (float.toString ()+"f");
}
}
위의 VisitCollection에서 우리는 접근 가능한지 여부를 결정하기 위해 하나의 판단 진술 만 사용하여 컬렉션의 각 요소에 대한 액세스를 구현합니다.
이 시점에서 우리는 방문자 모델의 기본 아키텍처를 완료했습니다.
방문자 모드 사용을위한 전제 조건
오브젝트 그룹 구조의 객체 유형은 거의 변경되지 않습니다. 즉, 위의 방문자 유형이 새로운 작업이 필요한 경우 위의 방문자 유형이 거의 변경되지 않습니다. 콘크리트 규정 별 구현 외에도 새로운 콘크리트 요소 2 ConcreteElement3도 필요합니다.
두 인터페이스 방문자 및 방문 가능에 대한 전제 조건이 있음을 알 수 있습니다. 방문자가 거의 변경 될 수 있으므로 방문자를 사용하는 것이 가장 편리합니다.
방문자가 자주 변경되면, 즉 객체 그룹의 객체 유형이 종종 변경되면, 일반적인 제안은 이러한 객체 클래스에서 작업을 하나씩 정의하는 것이 좋습니다. 그러나 Java의 반영 기술은이 문제를 해결합니다.