1

我正在编写一个应用程序,其中将有多个部门,每个部门都有单独的处理类。每个部门和部门处理由单独的类表示。

所以,现在java中的main方法看起来更像是一系列if else阶梯。

有什么办法让它更灵活,这样我以后就可以添加更多的部门和他们的处理类,而不需要对原来写的类做太多修改??

我读过抽象工厂模式,但除了它还有其他解决方案吗?

4

5 回答 5

2

创建一个隐藏部门的界面,例如“部门”。编写您的主要方法,例如:

main() {
    String criteria = ...; // this is how we choose the department to use,
                           // and you probably don't want to use a String
                           // but some other, more expressive type
    for (Department department : departments) {
        if (department.supports(criteria)) {
            department.doWhatever();
        }
    }
}

然后使用依赖注入来填充departments集合。根据您的设置方式,它可能是纯配置。

于 2011-08-04T19:22:49.907 回答
1

抽象工厂模式可能最适合您描述的场景。您将需要部门处理器的层次结构和部门类的匹配层次结构。抽象工厂将根据一些判别器为每一对生成一个具体工厂,为您处理部门并返回部门对象。

您的应用程序的其余部分不需要了解部门对象创建的差异,因为它将使用工厂简单地通过适当的鉴别器来获取部门。

添加新部门将需要新的部门类、处理器类和更新工厂逻辑。


或者,如果部门的结构都相同但处理不同,您可以考虑使用类似策略模式的东西。在这种情况下,您只有一个部门,但有关处理的决定将由战略来代替。因此,适当的Strategy被注入到部门中,部门的行为也随之不同。

于 2011-08-04T19:22:28.833 回答
1

有一个专门讨论该主题的网站。您想使用多态性和可能的​​反射,具体取决于您要执行的操作。

http://www.antiifcampaign.com/

于 2011-08-04T19:22:07.930 回答
1

您可以为每个州创建带有字段的枚举。然后在枚举中创建抽象方法init()并为每个成员实现它。

在您的代码中,您可以从例如属性文件中获取状态,然后说State.valueOf(state).init()

于 2011-08-04T19:22:13.170 回答
1

第一步是使用“工厂”或“抽象工厂”设计模式。这会将对象初始化逻辑从主代码中取出,并将其隔离在工厂类中。这样,您的主要代码将被关闭以进行修改并打开以进行扩展(又名Open Closed Principle)。您所做的更改将在工厂类中隔离。

如果你想更进一步,你也可以使用反射。一个例子是:

static Object createObject(String className) {
  Object object = null;
  try {
      Class classDefinition = Class.forName(className);
      object = classDefinition.newInstance();
  } catch (InstantiationException e) {
      System.out.println(e);
  } catch (IllegalAccessException e) {
      System.out.println(e);
  } catch (ClassNotFoundException e) {
      System.out.println(e);
  }
  return object;
}

使用此代码,您可以像这样简单地创建一个对象:

public static void main(String[] args) {
    NewDepartment dep = (NewDepartment) createObject("yourpackage.NewDepartment");
}

当然,使用反射时需要权衡取舍。这取决于您是否使用它。

于 2011-08-04T19:35:52.927 回答