Java 类太多的命令模式
我们的遗留代码有很长的if-else块代码,这些代码依赖于事件和对象类型Java 类太多的命令模式,java,design-patterns,Java,Design Patterns,我们的遗留代码有很长的if-else块代码,这些代码依赖于事件和对象类型 if(event == A && objectType == O1){ ..... } else if (event == A && objectType == O2){ .... } else if (....) .... .... 随着越来越多的条件的引入,我正在考虑用每个条件的命令模式来代替这个逻辑。但所需的类数为(事件数)*(对象类型数)。有没有更简单的方法来重构此代码?创建一个
if(event == A && objectType == O1){
.....
}
else if (event == A && objectType == O2){
....
}
else if (....)
....
....
随着越来越多的条件的引入,我正在考虑用每个条件的命令模式来代替这个逻辑。但所需的类数为(事件数)*(对象类型数)。有没有更简单的方法来重构此代码?创建一个包含
事件和对象类型的类,使其实现.equals()
和.hashCode()
。也为每个执行块创建一个泛型类
然后您将能够使用映射
,一个简单的查找将返回执行所需的内容。您可能要查找的模式通常称为双重分派模式,有时也称为访客模式
为事件和对象类型创建一组类。创建一个接口
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
}
然后
无法直接想到任何宏,但是您始终可以在IDE或编辑器中编写一些宏。。。在任何情况下都值得这样做,使用命令模式进行编码将更加清晰。如果条件块的内容完全不同,则为否。如果它们根据事件
和/或对象类型
共享某种通用逻辑,则为是。读这个
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
}