如果B依赖于C,但C是在A中创建的,如何将依赖关系B传递给A



我有一个对象A,用于替换给定Word文档中的文本序列。要构造A,必须将以下依赖项传递给其构造函数:

  • ReplaceBehavior:用于替换的抽象访问者(设计模式(的实现Word文档中不同类型的内容(例如,文本、图像、表格(

A在内部使用ApachePOI来处理Word文档。替换逻辑在Visitor实现(B(中定义,它作为依赖项传递给a。然而,要执行替换,B也需要C。就ApachePOI而言,C是一个XWPFDocument(https://poi.apache.org/apidocs/dev/org/apache/poi/xwpf/usermodel/XWPFDocument.html)。执行A的replaceContent方法时,三件事按以下顺序发生:

  1. A基于Word文档的输入文件路径实例化新的XWPFDocument(C(
  2. A将C分配给访问者B
  3. 访问者在应该替换的对象上执行

如果我是正确的,A是一个Facade(GoF设计模式(,因为它提供了一个";更容易";接口来替换Word文档中的内容。A被认为是";"更容易";,因为它封装了整个Apache POI相关代码。然而,A在内部创建了XWPF文档C,并(也在内部(将其分配给访问者B。我不确定在执行B之前将C分配给访问者是否是一种好的做法?如果没有,我们如何才能更好地解决这个问题?或者,可以构造C和B,将C分配给B,然后在构造时将它们都传递给A。但是,使用a的客户端必须自己实例化ApachePOI类(XWPFDocument(,这就破坏了Facade的目的。以下伪代码总结了上述问题:

public class A {
private IReplaceVisitor b;
public A(IReplaceVisitor b) {
this.b = b;
}      
public void replaceContent(List<ReplacementObject> objectsToReplace, String inputWordPath, String outputWordPath) {
XWPFDocument c = new XWPFDocument(inputWordPath);
b.setDocument(c);
foreach act in objectsToReplace execute act.accept(b);
// write updated XWPFDocument c to disk
}
}
// use of A somewhere else ...
public void testReplacement(List<ReplacementObject> objectsToReplace) {
IReplaceVisitor b = new ConreteReplaceVisitor();
A a = new A(b);
a.replaceContent(objectsToReplace, "input Word path", "destination path of the updated Word 
document");
}

提前谢谢。

嗯。。。不知道你想在那里解释什么,也不知道你为什么过于复杂(或者至少在我看来是这样(。

这就是我的docx生成器所使用的:

for (XWPFParagraph paragraph : xdoc.getParagraphs()) {
// simple run data text replace...
for (XWPFRun run : paragraph.getRuns()) {
String text = run.getText(0);
if (text != null) {
for (DOC_FLAGS value : DOC_FLAGS.values()) {
if (text.contains(value.name())) {
System.out.println(text);
System.out.println(value.value);
text = text.replace(value.name(), value.value);
run.setText(text, 0);
}
}
}
}
}

最新更新