┌──────────────────────────────────┐ │ <<interface>> │ │ ExtractionVisitor │ ← Visitor ├──────────────────────────────────┤ │ + visitOCR(OCRExtractor): void │ │ + visitTika(TikaExtractor): void │ └──────────────────────────────────┘ △ │ implements │ ┌───────────────────────┬─────────────────────────────┐ │ TextExtractionVisitor │ MetadataExtractionVisitor │ ← Concrete Visitors ├───────────────────────┼─────────────────────────────┤ │+ visitOCR() │+ visitOCR() │ │+ visitTika() │+ visitTika() │ └───────────────────────┴─────────────────────────────┘ ┌───────────────────────────────────┐ │ <<interface>> │ │ TextExtractor │ ← Element ├───────────────────────────────────┤ │ + accept(ExtractionVisitor): void │ └───────────────────────────────────┘ △ │ implements │ ┌────────────────────────┬────────────────────────┐ │ OCRExtractor │ TikaExtractor │ ← Concrete Elements ├────────────────────────┼────────────────────────┤ │ - documentPath: String │ - documentPath: String │ │ + accept() │ + accept() │ │ + getDocumentPath() │ + getDocumentPath() │ └────────────────────────┴────────────────────────┘
Visitor Interface
:public interface ExtractionVisitor { void visitOCR(final OCRExtractor ocrExtractor); void visitTika(final TikaExtractor tikaExtractor); }
Concrete Visitors
:public class TextExtractionVisitor implements ExtractionVisitor { public void visitOCR(final OCRExtractor ocrExtractor) { System.out.println("OCR Text Extraction from: " + ocrExtractor.getDocumentPath()); } public void visitTika(final TikaExtractor tikaExtractor) { System.out.println("Tika Text Extraction from: " + tikaExtractor.getDocumentPath()); } }Metadata Extraction Visitor:
public class MetadataExtractionVisitor implements ExtractionVisitor { public void visitOCR(final OCRExtractor ocrExtractor) { System.out.println("OCR Metadata Extraction from: " + ocrExtractor.getDocumentPath()); } public void visitTika(final TikaExtractor tikaExtractor) { System.out.println("Tika Metadata Extraction from: " + tikaExtractor.getDocumentPath()); } }
Element Interface
:public interface TextExtractor { void accept(final ExtractionVisitor visitor); }
Concrete Elements
:public class OCRExtractor implements TextExtractor { private final String documentPath; public OCRExtractor(final String documentPath) { this.documentPath = documentPath; } public String getDocumentPath() { return documentPath; } public void accept(final ExtractionVisitor visitor) { visitor.visitOCR(this); } }Tika Extractor Element:
public class TikaExtractor implements TextExtractor { private final String documentPath; public TikaExtractor(final String documentPath) { this.documentPath = documentPath; } public String getDocumentPath() { return documentPath; } public void accept(final ExtractionVisitor visitor) { visitor.visitTika(this); } }
public class VisitorPatternTest { public static void main(String[] args) { // Create text extractors TextExtractor ocrExtractor = new OCRExtractor("image.png"); TextExtractor tikaExtractor = new TikaExtractor("document.docx"); // Create visitors ExtractionVisitor textExtractor = new TextExtractionVisitor(); ExtractionVisitor metadataExtractor = new MetadataExtractionVisitor(); System.out.println("Text Extraction"); ocrExtractor.accept(textExtractor); tikaExtractor.accept(textExtractor); System.out.println("Metadata Extraction"); ocrExtractor.accept(metadataExtractor); tikaExtractor.accept(metadataExtractor); } }