Java:在以下代码中使用命令模式

时间:2012-05-25 07:03:31

标签: java design-patterns refactoring

我的代码类似于以下内容:

void processObjectRecursively(Object obj)
{
    Field[] fields = obj.getClass().getDeclaredFields();

    for(Field field : fields)
    {
        FieldType type = FieldUtils.getType(field); // FieldType is enum
        Object value = field.get(obj);

        switch(type)
        {
            case A:
            processObjectRecursively(value);
            continue;

            case LIST:
            processList((List<?>)value);
            continue;

            case B:
            processB(value);
            continue;

            case C:
            processC(value);
            continue;
        }
    }
}

void processList(List<?> list)
{
    for(Object obj : list)
    {
        processObjectRecursively(obj);
    }
}

void processB(Object obj)
{
    // do something
}

void processC(Object obj)
{
    // do something
}

现在。我不喜欢这个长开关盒。所以我正在考虑创建命令并用它们填充Map,其中type是键,值是相应的命令对象。有了这个,该方法看起来像:

void processObjectRecursively(Object obj)
{
    Field[] fields = obj.getClass().getDeclaredFields();

    for(Field field : fields)
    {
        FieldType type = FieldUtils.getType(field); // FieldType is enum
        Object value = field.get(obj);
        Command command = commandMap.get(type);
        command.execute(value, this); // 'this' needed for calling processObjectRecursively()
    }
}

但为此,我需要创建一个接口和另外四个类。那么这种方法还可以,还是过度设计?你能否提出任何其他更简单的方法来达到同样的效果?

4 个答案:

答案 0 :(得分:2)

这里的命令模式听起来不错。但我宁愿寻找使用各种值类型来解决这个问题的可能性,而不是使用Object。所以,我可以简单地写下面的单行,

value.process()

答案 1 :(得分:1)

如果有新的处理类型会发生什么。在第一种方法中,您将添加案例。如果在开关中。如果使用命令模式,则需要注入新命令及其类型及其启动和运行。我会在任何一天使用第二种方法

为什么你需要传递这个? recurciveProcessing可以是使用map获取命令来处理请求的命令吗?

答案 2 :(得分:1)

我同意最好避免切换案例陈述。所以创建一个命令图就行了。另一种更简单的方法是在您的枚举中添加流程方法,以便每个枚举类型都知道如何处理数据。

答案 3 :(得分:0)

切换块没有问题。 JVM有很好的处理方式,不会影响性能。