Visitor 방문자 모드는 언제 사용합니까?
5917 단어 visitor
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);
}
}
}
}
。。。
}
방문자 모드는 방문자가 상대적으로 고정되어 있고 방문 방식이 바뀌기 쉬운 경우에 더욱 적합하다.