5

我们的遗留代码有很长的 if else 块代码,这些代码依赖于事件和对象类型

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

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

4

2 回答 2

6

创建一个包含eventand的类objectType,使其实现.equals()and .hashCode()。也为每个执行块创建一个通用类。

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

于 2013-06-14T11:34:41.460 回答
3

您可能正在寻找的模式通常称为双重调度或有时称为访客模式。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
}
于 2013-06-14T12:35:16.200 回答