我目前正在开发一个必须渲染多个Freemarker模板的应用程序。到目前为止,我有一个处理渲染的Generator类。这堂课或多或少看起来像这样:
public class Generator {
public static void generate(…) {
renderTemplate1();
renderTemplate2();
renderTemplate3();
}
private static void render(…) {
// renders the template
}
private static void renderTemplate1() {
// Create config object for the rendering
// and calls render();
};
private static void renderTemplate1() {
// Create config object for the rendering
// and calls render();
};
…
}
这很有效,但它确实感觉不对。我想要做的是创建一个包含所有renderTemplate ...()方法的类,然后从我的Generator类动态调用它们。这将使其更清洁,更容易扩展。我正在考虑使用像反射这样的东西,但它也不是一个真正的好解决方案。 关于如何正确实现这一点的任何想法?
答案 0 :(得分:2)
创建Renderer
界面。
创建一个包含Renderer
实现的数组。
迭代调用它们的数组。
interface Renderer {
void renderTemplate();
}
static final Render[] renderers = new Render[] {
new Renderer {
public void renderTemplate() {
// Create config object for the rendering of 1
// and calls render();
}
},
new Renderer {
public void renderTemplate() {
// Create config object for the rendering of 2
// and calls render();
}
},
}
public static void generate() {
for (Renderer r: renderers) {
r.renderTemplate();
}
}
您可能需要考虑将Renderer
作为抽象类,并在所有Renderer
实现共享的情况下将Render方法放在其中。
答案 1 :(得分:0)
您可以拥有一个定义方法的接口render
,其中包含用于渲染您所用模板的逻辑。
一旦你拥有了它,你的所有渲染器都将实现该方法并具有所需的逻辑。最后,您可以按照this上一篇SO帖子的内容执行操作,以自动查找并初始化您的模板类。
对于增强功能,您还可以将上述内容与.properties
文件或数据库结合使用,以允许某些模板无法自动启用或提供进一步的初始化参数。