Visitor 방문자 모드는 언제 사용합니까?

5917 단어 visitor
집합 대상은 대부분 같은 종류의 대상의 집합이고 집합 대상에 대한 조작은 바로 같은 종류의 대상에 대한 조작이다.그러나 집합 대상에 저장된 대상이 다르면 어떻게 이런 서로 다른 유형의 대상을 조작합니까?일반적으로 대상의 유형에 따라 판단하고 조작하면 많은if else 문장이 나타나기 쉽다.만약에 방문자 모델을 사용한다면 이런 문제를 우아하게 해결할 수 있고 방문자는 다태를 이용하여 모든 대상을 방문할 수 있다.
Dom4J의 방문자 모드:
 
public interface Visitor {
    /**
     * <p>
     * Visits the given <code>Document</code>
     * </p>
     * 
     * @param document
     *            is the <code>Document</code> node to visit.
     */
    void visit(Document document);

    /**
     * <p>
     * Visits the given <code>DocumentType</code>
     * </p>
     * 
     * @param documentType
     *            is the <code>DocumentType</code> node to visit.
     */
    void visit(DocumentType documentType);

    /**
     * <p>
     * Visits the given <code>Element</code>
     * </p>
     * 
     * @param node
     *            is the <code>Element</code> node to visit.
     */
    void visit(Element node);

    /**
     * <p>
     * Visits the given <code>Attribute</code>
     * </p>
     * 
     * @param node
     *            is the <code>Attribute</code> node to visit.
     */
    void visit(Attribute node);

    /**
     * <p>
     * Visits the given <code>CDATA</code>
     * </p>
     * 
     * @param node
     *            is the <code>CDATA</code> node to visit.
     */
    void visit(CDATA node);

    /**
     * <p>
     * Visits the given <code>Comment</code>
     * </p>
     * 
     * @param node
     *            is the <code>Comment</code> node to visit.
     */
    void visit(Comment node);

    /**
     * <p>
     * Visits the given <code>Entity</code>
     * </p>
     * 
     * @param node
     *            is the <code>Entity</code> node to visit.
     */
    void visit(Entity node);

    /**
     * <p>
     * Visits the given <code>Namespace</code>
     * </p>
     * 
     * @param namespace
     *            is the <code>Namespace</code> node to visit.
     */
    void visit(Namespace namespace);

    /**
     * <p>
     * Visits the given <code>ProcessingInstruction</code>
     * </p>
     * 
     * @param node
     *            is the <code>ProcessingInstruction</code> node to visit.
     */
    void visit(ProcessingInstruction node);

    /**
     * <p>
     * Visits the given <code>Text</code>
     * </p>
     * 
     * @param node
     *            is the <code>Text</code> node to visit.
     */
    void visit(Text node);
}


 
 
 
모든 유형은 Node에서 계승되어 방문자의 accept () 방법을 받아들인다.
 
public interface Node extends Cloneable {

   。。。

    /**
     * <p>
     * <code>accept</code> is the method used in the Visitor Pattern.
     * </p>
     * 
     * @param visitor
     *            is the visitor in the Visitor Pattern
     */
    void accept(Visitor visitor);

    。。。

}

 
 
전체 문서를 훑어보려고 할 때, 간단한 방문자를 실현하고, 그를 문서 대상(Visitor Support는 Visitor에서 계승함)에 전달하면 xml 문서 전체를 훑어볼 수 있습니다.
 
public class VisitorSample {

  public void demo(Document doc) {

    Visitor visitor = new VisitorSupport() {
      public void visit(Element element) {
        System.out.println(
          "Entity name: " + element.getName()  + "text " + element.getText();
        );
      }
    };

    doc.accept( visitor );
  }
}



 
 
구체적인 Document 스트리밍 작업은 다음과 같습니다.
 
public abstract class AbstractDocument extends AbstractBranch implements Document {

。。。


/**
     * <p>
     * <code>accept</code> method is the <code>Visitor Pattern</code>
     * method.
     * </p>
     * 
     * @param visitor
     *            <code>Visitor</code> is the visitor.
     */
    public void accept(Visitor visitor) {
        visitor.visit(this);

        DocumentType docType = getDocType();

        if (docType != null) {
            visitor.visit(docType);
        }

        // visit content
        List content = content();

        if (content != null) {
            for (Iterator iter = content.iterator(); iter.hasNext();) {
                Object object = iter.next();

                if (object instanceof String) {
                    Text text = getDocumentFactory()
                            .createText((String) object);
                    visitor.visit(text);
                } else {
                    Node node = (Node) object;
                    node.accept(visitor);
                }
            }
        }
    }

。。。

}

 
 
방문자 모드는 방문자가 상대적으로 고정되어 있고 방문 방식이 바뀌기 쉬운 경우에 더욱 적합하다.

좋은 웹페이지 즐겨찾기