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打印作业的所有打印数据,打印服务代理可以使用以下两种模式之一:
- 交错模式:从当前multidoc获取doc。从当前doc获取打印数据表示对象。从打印数据表示对象获取所有打印数据。从当前multidoc获取下一个multidoc,并重复直到没有更多为止。(上面的代码示例使用了交错模式。)
- 一次性全部模式:从当前multidoc获取doc,并将doc保存在列表中。从当前multidoc获取下一个multidoc,并重复直到没有更多为止。然后遍历保存的doc列表。从当前doc获取打印数据表示对象。从打印数据表示对象获取所有打印数据。转到列表中的下一个doc,并重复直到没有更多为止。
为了解决这个问题,并简化向打印作业提供多个doc的客户端的设计,每个支持multidoc打印作业的打印服务代理都必须使用交错模式访问MultiDoc
对象。也就是说,给定一个MultiDoc
对象,打印服务代理将调用getDoc()
一次或多次,直到成功获取当前Doc
对象。然后,打印服务代理将获取当前doc的打印数据,直到获取所有打印数据或发生不可恢复的错误为止。如果能够继续,打印服务代理将调用next()
一次或多次,直到成功获取下一个MultiDoc
对象或指示没有更多为止。接口MultiDoc
的实现可以假定打印服务代理将遵循这种交错模式;对于任何其他使用模式,MultiDoc
实现的行为是未指定的。
没有限制可以同时访问相同multidoc的客户端线程的数量。因此,所有实现MultiDoc
接口的实现必须设计为多线程安全的。实际上,一个客户端线程可以在(概念上的)列表末尾添加doc,而一个打印作业线程可以同时从列表开头获取doc;只要multidoc对象正确同步线程,这两个线程就不会相互干扰。
-
Method Summary
-
Method Details
-
getDoc
获取当前doc对象。- 返回:
- 当前doc对象
- 抛出:
-
IOException
- 如果读取文档时发生错误
-
next
转到包含序列中下一个doc对象的multidoc对象。- 返回:
-
包含下一个doc对象的multidoc对象,如果没有更多doc对象则返回
null
- 抛出:
-
IOException
- 如果定位下一个文档时发生错误
-