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:在以下代码中使用命令模式的主要内容,如果未能解决你的问题,请参考以下文章