В представленном коде реализован паттерн стратегия для обработки разных типов документов. Есть интерфейс DocumentProcessor (не показан, но подразумевается), который реализуют конкретные процессоры для PDF, DOCX и XML.
public class RefEx {
В представленном коде реализован паттерн стратегия для обработки разных типов документов. Есть интерфейс DocumentProcessor (не показан, но подразумевается), который реализуют конкретные процессоры для PDF, DOCX и XML.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
public class RefEx { public static class PdfProcessor implements DocumentProcessor { }
public static class DocxProcessor implements DocumentProcessor {
@Override
public void process(Document document) {
// Специфическая логика для обработки Word
}
}
public static class XmlProcessor implements DocumentProcessor {
@Override
public void process(Document document) {
// Специфическая логика для обработки XML
}
}
public static class DocumentService {
private final Map<DocumentType, DocumentProcessor> processors = Map.of(
DocumentType.PDF, new PdfProcessor(),
DocumentType.DOCX, new DocxProcessor(),
DocumentType.XML, new XmlProcessor()
);
public void process(Document[] documents) {
for (Document doc : documents) {
DocumentProcessor processor = processors.get(doc.type);
if (processor == null) {
break;
}
// Общая логика обработки документа
processor.process(doc);
}
}
}
}
Ответ
В представленном коде реализован паттерн стратегия для обработки разных типов документов. Есть интерфейс DocumentProcessor (не показан, но подразумевается), который реализуют конкретные процессоры для PDF, DOCX и XML.
В классе DocumentService хранится словарь processors, где ключ — тип документа, а значение — соответствующий процессор. Метод process перебирает массив документов, выбирает нужный процессор по типу и вызывает его метод process.
Такой подход позволяет легко расширять поддержку новых форматов, добавляя новые классы процессоров и обновляя мапу. Общая логика обработки вынесена в сервис, а специфичная — в отдельные классы.
Пример интерфейса и использования:
public interface DocumentProcessor {
void process(Document document);
}
// В DocumentService
public void process(Document[] documents) {
for (Document doc : documents) {
DocumentProcessor processor = processors.get(doc.type);
if (processor == null) {
break; // или можно выбросить исключение
}
// Общая логика
processor.process(doc);
}
}
Это классический пример использования полиморфизма и инверсии управления для гибкой архитектуры.