0

我是 Java 新手,我有一些问题要问更高级的开发人员。

我有基于 Swing 的 GUI 应用程序,其中有几个AbstractActions. 一大群AbstractActions基于JPanel. 例如:

// opens "Documents" tab
documentsAction = new AbstractAction(DOCUMENTS) {
  @Override
  public void actionPerformed(ActionEvent e) {
    try {
      int index = getTabIndex(DOCUMENTS);
      if (index >= 0) {
        // Tab exists, just open it.
        tabbedPane.setSelectedIndex(index);
      } else {
        // No tab. Create it and open
        newCatalogTab(new DocumentService(), DOCUMENTS);
      }
    } catch (ServiceException ex) {
      printError(ex.getMessage());
    }
  }
};
documentsItem.setAction(documentsAction);

在哪里getTabIndex

  private int getTabIndex(String tabName) {
    int result = -1;
    for (int i = 0; i < tabbedPane.getTabCount(); i++) {
      if (tabName.equals(tabbedPane.getTitleAt(i))) {
        result = i;
        break;
      }
    }
    return result;
  }

并且newCatalogTab是:

  private void newCatalogTab(ICatalog service, String Name) throws ServiceException {
    CatalogPanel panel = new CatalogPanel(service);
    tabbedPane.add(Name, panel);
    tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
    checkTabs(); // changes activity of buttons like "edit" and "delete"
  }

所以,许多AbstractAction人做类似的工作:

  1. 创建扩展类的实例AbstractPanel
  2. 将数据访问接口(DocumentService在示例中)传递给实例;
  3. 使用实例创建一个新选项卡。

如果数据访问接口将使用不同的 POJO,我可以以某种方式对其进行模板化吗?我可以创建通用接口并使用它吗?你能告诉我正确的思考方向吗?

谢谢你浪费你的时间。

4

1 回答 1

1

Java中没有模板,所以无论如何都会有一些代码重复。但是,您可以使用factory删除一些样板代码。例如:

interface CatalogFactory {
    public ICatalog makeCatalog();
}

class DocumentServiceFactory implements CatalogFactory {
    @Override
    public ICatalog makeCatalog() {
        return new DocumentService();
    }
}

class TabAction extends AbstractAction {
    private final String name;
    private final CatalogFactory factory;

    //Appropriate constructor...

    @Override
    public void actionPerformed(ActionEvent e) {
        //...
        newCatalogTab(factory.makeCatalog(), name);
        //...
    }
}

然后你可以做

documentsItem.setAction(new TabAction(DOCUMENTS, new DocumentServiceFactory()));

无需为每个选项卡创建单独的匿名 AbstractAction。

对于面板和可能适合此模式的其他对象也是如此。

于 2013-06-27T09:28:56.767 回答