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

Posted

技术标签:

【中文标题】Java:在以下代码中使用命令模式【英文标题】:Java: using command pattern in the following code 【发布时间】:2012-05-25 07:03:30 【问题描述】:

我有类似下面的代码:

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,其中类型是键,值是其对应的命令对象。有了这个,该方法看起来像:

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()
    

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

【问题讨论】:

你想要 break; 而不是 continue; 语句。 @Jivings 不会继续带我进入开始循环了吗?还是它的行为会与 break 不同? @Jivings ***.com/questions/2521721/… 它会跳到switch的末尾,然后会跳回到循环的开头。 Continue 是多余且令人困惑的。 @ejb_guy 不知道你为什么把我和那个问题联系起来。 我的坏。我以为你的意思是 continue 将落入下一个案例。 【参考方案1】:

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

value.process()

【讨论】:

【参考方案2】:

我同意最好避免使用 switch case 语句。所以创建一个命令映射就可以了。另一种更简单的方法是在枚举中添加 process 方法,以便每个枚举类型都知道如何处理数据。

【讨论】:

【参考方案3】:

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

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

【讨论】:

'this' 指向具有'recursiveProcessing' 方法的对象,所以它是'外部' 对象。我需要将它传递给命令,以便命令可以在外部对象上调用“recursiveProcessing”。 可以有AbstrctCommand存储地图。这样所有命令都可以访问命令映射并且递归命令可以使用该映射。我会说这不仅仅是命令。这是命令和工厂的混合。但我在这里可能是错的。【参考方案4】:

那个开关块没有问题。 JVM 有很好的处理方法,不会影响性能。

【讨论】:

以上是关于Java:在以下代码中使用命令模式的主要内容,如果未能解决你的问题,请参考以下文章

Java描述设计模式(20):命令模式

cmd命令启动jar包或redis服务偶尔发生程序异常问题

如何在可视模式下在外部过滤器命令中使用 vim 变量?

设计模式之命令模式-使用命令模式实现遥控器及总结

java设计模式-----23命令模式

JAVA SCRIPT设计模式--行为型--设计模式之Command命令模式(14)