2010-06-25 80 views
0

我有一个情况(伪代码):决策设计模式帮助

Action a; 
Object o; 
if(objectIsPartOfGroup(o, "Group1")) 
    a = treatCaseGroup1(); 
if(a != indecisive) 
    return a; 

if(objectIsPartOfGroup(o, "Group2")) 
    a = treatCaseGroup2(); 
if(a != indecisive) 
    return a; 

if(objectIsPartOfGroup(o, "Group3")) 
    a = treatCaseGroup3(); 
if(a != indecisive) 
    return a; 
. 
. 
. 

,我在想,如果有这种情况适用的模式,这样我就不必重复“如果(a!=优柔寡断)返回a;“检查每一步后?我发现重复这个代码是不是很专业?它增加了很多代码行,完全没有帮助清晰,因此我觉得它很糟糕。

编辑:一个对象可以是group1和group2以及group3等的一部分......所以说一个对象是group1的一部分,并且该动作是未决定的,因为它也是group2的一部分,它将被再次处理并且再次,直到所有组都得到了治疗。最后,结果也可能是不明确的!

感谢您的帮助!

戴夫

回答

3
public Action determimeAction(Object o, List<String> groups) { 
    for (String group : groups) { 
     if (((GroupI) o).isPartOf(group)) { 
      Action a = ((GroupI) o).treatCaseGroup(group); 
      if (a != indecisive) { // could this be a.isDecicive() 
       return a; 
      } 
     } 
    } 
    return null; // or whatever 
} 

public interface GroupI() { 
    public Action treatCaseGroup(String group); // is implemented to know which Action to get. 
    public Boolean isPartOf(Stirng group); // is implemented the same as your example just move the method to your object 
} 

public class GroupImpl implements GroupI { 
    public Boolean isPartOf(Stirng group) { 
    } 
    public Action treatCaseGroup(String group) { 
     // use if, case, factory, or Dep Inection to get the correct action. 
    } 
} 

不知道所有的逻辑是这样的应该工作。

+0

谢谢,这将工作!我会等待看看是否有其他想法出现 – 2010-06-25 20:19:09

2

退房的Visitor design pattern

实质上,访问者模式是关于在不同的静态对象上执行不同的操作,而不会将它们绑定得太紧。

正确重构你的代码,你会简单地做:

o.treat(); 
+0

SRY我不是清楚。如果对象是group1的一部分,它也可以是group2,group3等的一部分,所以如果我打电话给treat();在我的对象上,它仍然可以完成“不败”。另外,最终的结果可能是不明确的。请纠正我,如果我完全当然! – 2010-06-25 19:03:43

-2

这不是一个模式,这是没有什么深入的(它解决只有你问到具体的事情),但会是这样的工作?

Action a; 
Object o; 

while (a == indecisive) 
{ 
    if(objectIsPartOfGroup(o, "Group1")) 
     a = treatCaseGroup1(); 
    if(objectIsPartOfGroup(o, "Group2")) 
     a = treatCaseGroup2(); 
    if(objectIsPartOfGroup(o, "Group3")) 
     a = treatCaseGroup3(); 
} 

return a 
+0

sry我不清楚。如果对象是group1的一部分,它也可以是group2,group3等的一部分。因此,如果我这样做,o,即group1和2的一部分,将始终对group1进行处理,并始终处于不决定的状态。 – 2010-06-25 19:04:40

+0

@David:根据Yuval A所说的,访客设计模式可能是你应该去的方式。 – JAB 2010-06-25 19:18:22

+0

我只是不明白如何访问者可以多次处理单个对象,如果它的不同组的部分 – 2010-06-25 19:43:17