【问题标题】:Java - Calling all methods of a classJava - 调用类的所有方法
【发布时间】:2014-06-11 09:21:36
【问题描述】:

我目前正在开发一个必须呈现多个 Freemarker 模板的应用程序。到目前为止,我有一个处理渲染的生成器类。这个类或多或少看起来像这样:

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 类中动态调用它们。这将使它更清洁和更容易扩展。我正在考虑使用反射之类的东西,但它也不是一个好的解决方案。 关于如何正确实施这一点的任何想法?

【问题讨论】:

  • 请添加有关您的域模型的更多信息 - 是否有许多独立渲染的生成器(经典的 OOP,其中每个生成器都包含他需要渲染的信息),或者您是否有一个渲染器来渲染按照一定的流程?

标签: java design-patterns reflection


【解决方案1】:

创建一个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 方法放入其中。

【讨论】:

  • 这就是我最终要做的。非常感谢!
【解决方案2】:

您可以拥有一个带有已定义方法的接口,render,其中包含呈现您所追求的模板的逻辑。

一旦你有了它,你所有的渲染器都会实现那个方法并拥有所需的逻辑。最后,您可以按照this 之前的 SO 帖子的方式执行一些操作,以自动查找和初始化您的模板类。

为了增强功能,您还可以将上述内容与.properties 文件或数据库结合起来,以允许不自动启用某些模板或提供进一步的初始化参数。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多