具有太多类的命令模式

时间:2013-06-14 11:29:55

标签: java design-patterns

我们的遗留代码包含依赖于事件和对象类型的if else块的长代码

if(event == A && objectType == O1){
.....
}
else if (event == A && objectType == O2){
 ....
}
else if (....)
....
....

随着越来越多的条件的引入,我正在考虑用每个条件的Command模式替换这个逻辑。但是所需的类数量是(事件数量)*(对象类型的数量)。有没有更简单的方法来重构这段代码?

2 个答案:

答案 0 :(得分:6)

创建一个括起eventobjectType的类,使其实现.equals().hashCode()。为每个执行块创建一个通用类。

然后,您将能够使用Map,并且简单的查找将返回执行所需的内容。

答案 1 :(得分:2)

您可能正在寻找的模式通常称为双重调度或有时称为访客模式。 http://en.wikipedia.org/wiki/Visitor_pattern

为事件创建一组类,为对象类型创建一组。创建一个界面

public interface VisitEvent {
    public void visit(EventA eventA);
    public void visit(EventB eventB);
    // for each event class
}

在事件类中,您必须在对象类型类上调用访问模式。

public class EventA {
    public void visit(ObjectTypeParent otp) {
        otp.visit(this);
    }
}

假设对象类型类继承自公共类

public abstract class ObjectTypeParent implements VisitEvent {
    public void visit(EventA eventA) {
        // default code here
    }
    // same for each event visit from VisitEvent
}

然后

public class ObjectType01 extends ObjectTypeParent {
    public void visit(EventA eventA) {
       // stuff you want done for this combination
    }
    // don't implement the ones that have common behavior
}