我们的遗留代码包含依赖于事件和对象类型的if else块的长代码
if(event == A && objectType == O1){
.....
}
else if (event == A && objectType == O2){
....
}
else if (....)
....
....
随着越来越多的条件的引入,我正在考虑用每个条件的Command模式替换这个逻辑。但是所需的类数量是(事件数量)*(对象类型的数量)。有没有更简单的方法来重构这段代码?
答案 0 :(得分:6)
创建一个括起event
和objectType
的类,使其实现.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
}