Интерфейс MultiDoc

public interface MultiDoc

Интерфейс MultiDoc определяет интерфейс для объекта, который предоставляет более одного фрагмента данных для печати для задания печати. "Doc" — это краткое и легко произносимое слово, означающее "фрагмент данных для печати", а "multidoc" — это группа нескольких doc. Клиент передает объекту задания печати объект, реализующий интерфейс MultiDoc, и задание печати вызывает методы этого объекта для получения данных для печати.

Интерфейс MultiDoc предоставляет абстракцию, аналогичную "связанному списку" doc. Объект multidoc подобен узлу в связанном списке, содержащему текущий doc в списке и указатель на следующий узел (multidoc) в списке. Задание печати может вызвать метод multidoc getDoc(), чтобы получить текущий doc. Когда оно готово перейти к следующему doc, задание печати может вызвать метод multidoc next(), чтобы получить следующий multidoc, который содержит следующий doc. Таким образом, код задания печати для доступа к multidoc может выглядеть так:

void processMultiDoc(MultiDoc theMultiDoc) {

          MultiDoc current = theMultiDoc;

          while (current != null) {
              processDoc (current.getDoc());
              current = current.next();
          }
      }
Конечно, интерфейс MultiDoc может быть реализован любым способом, который выполняет контракт; он не обязательно должен использовать связанный список в реализации.

Чтобы получить все данные для печати для задания печати multidoc, прокси-сервис печати может использовать любой из двух шаблонов:

  1. Шаблон перемежающийся: Получить doc из текущего multidoc. Получить объект представления данных для печати из текущего doc. Получить все данные для печати из объекта представления данных для печати. Получить следующий multidoc из текущего multidoc и повторить до тех пор, пока не останется больше. (Приведенный выше пример кода использует перемежающийся шаблон.)
  2. Шаблон все сразу: Получить doc из текущего multidoc и сохранить doc в списке. Получить следующий multidoc из текущего multidoc и повторить до тех пор, пока не останется больше. Затем проитерировать по списку сохраненных doc. Получить объект представления данных для печати из текущего doc. Получить все данные для печати из объекта представления данных для печати. Перейти к следующему doc в списке и повторить до тех пор, пока не останется больше.
Теперь рассмотрим клиента печати, который генерирует данные для печати на лету и не имеет ресурсов для хранения более одного фрагмента данных для печати одновременно. Если прокси-сервис печати использовал шаблон "все сразу" для получения данных для печати, это создаст проблему для такого клиента; клиенту придется хранить все данные для печати doc до тех пор, пока прокси-сервис печати не вернется и не запросит их, что клиент не может сделать. Для работы с таким клиентом прокси-сервис печати должен использовать перемежающийся шаблон.

Для решения этой проблемы и упрощения проектирования клиентов, предоставляющих несколько doc заданию печати, каждый прокси-сервис печати, поддерживающий задания печати multidoc, обязан получить доступ к объекту MultiDoc с использованием перемежающегося шаблона. То есть, имея объект MultiDoc, прокси-сервис печати будет вызывать getDoc() один или несколько раз до тех пор, пока он успешно не получит текущий объект Doc. Прокси-сервис печати затем получит текущие данные для печати doc, не продолжая, пока все данные для печати не будут получены или не произойдет необратимая ошибка. Если он сможет продолжить, прокси-сервис печати затем вызовет next() один или несколько раз до тех пор, пока он успешно не получит следующий объект MultiDoc или указание о том, что больше нет. Реализация интерфейса MultiDoc может предполагать, что прокси-сервис печати будет следовать этому перемежающемуся шаблону; поведение реализации MultiDoc для других шаблонов использования не определено.

Нет ограничений на количество потоков клиентов, которые могут одновременно обращаться к одному и тому же multidoc. Поэтому все реализации интерфейса MultiDoc должны быть спроектированы для обеспечения многопотоковой безопасности. Фактически, поток клиента мог бы добавлять doc в конец (понятийного) списка, в то время как поток задания печати одновременно получал doc из начала списка; при условии, что объект multidoc должным образом синхронизирует потоки, два потока не будут мешать друг другу.

Методы

Модификатор и тип Метод Описание
Doc getDoc()

Получить текущий объект doc.

MultiDoc next()

Перейти к объекту multidoc, содержащему следующий объект doc в последовательности объектов doc.

Методы

getDoc

Doc getDoc()
    throws IOException

Получить текущий объект doc.

Возвращает:
текущий объект doc
Исключения:
IOException - если произошла ошибка при чтении документа

next

MultiDoc next()
       throws IOException

Перейти к объекту multidoc, содержащему следующий объект doc в последовательности объектов doc.

Возвращает:
объект multidoc, содержащий следующий объект doc, или null если больше нет объектов doc
Исключения:
IOException - если произошла ошибка при поиске следующего документа

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/print/MultiDoc.html

Spec-Zone .ru
спецификации, руководства, описания, API