这个 UI 代码的辅助方法会是什么样子?

How would a helper method for this UI code look like?

我想重构一些 UI 代码。

我有一个 HTML 表单(此处:用 Java GUI 编写,称为 Wicket),我在其中放置了一些链接(锚标签)。 我不想一遍又一遍地重复代码,而是想创建一个新的优雅的辅助方法。

String type = "", id = ""; 
Form form, Service service;

form.add(new Widget("createLink", form) { // the same for read, update, delete
    private static final long serialVersionUID = 1L;
    @Override
    public void onSubmit() {
        try {
            service.create(type, id);  // the same for service.read / update / delete
            info("Specific message for create, read, update, delete");
        } catch (DataAccessException e) {
            error(ExceptionUtils.getRootCauseMessage(e));
        }
    }
});
form.add(new Widget("readLink", form) {
    // ... service.read(...); info("... read ...");
});
form.add(new Widget("updateLink", form) {
    // ... service.update(...); info("... update ...");
});

正如你已经猜到的,我想要某物。喜欢

form.add(createLink(htmlId, form, type, id, message, ?));

我想避免为此创建一个额外的 class。但是 Lambda 就可以了。

最好的方法是什么? 模式又是如何命名的?

谢谢。

对于 ? 你可以使用 java.util.function.Consumer:

private void createLink(String htmlId, Form<?> form, String type, String id, String feedbackMessage, Runnable _onSubmit) {
    return new Widget(htmlId, form) {
      private static final long serialVersionUID = 1L;

      @Override
      public void onSubmit() {
        try {
          _onSubmit();
          info(feedbackMessage);
        } catch (DataAccessException e) {
          error(ExceptionUtils.getRootCauseMessage(e));
        }
      }
    }
}

用法:

form.add(createLink("createLink", form, type, id, createMessage, () -> {
  service.create(type, id);
}));

您还可以查看 WicketStuff 中的 this utility class,它的功能与 Ajax 链接非常相​​似。