Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类太多的命令模式_Java_Design Patterns - Fatal编程技术网

Java 类太多的命令模式

Java 类太多的命令模式,java,design-patterns,Java,Design Patterns,我们的遗留代码有很长的if-else块代码,这些代码依赖于事件和对象类型 if(event == A && objectType == O1){ ..... } else if (event == A && objectType == O2){ .... } else if (....) .... .... 随着越来越多的条件的引入,我正在考虑用每个条件的命令模式来代替这个逻辑。但所需的类数为(事件数)*(对象类型数)。有没有更简单的方法来重构此代码?创建一个

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

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
}