Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 (paramType != reponse.paramType) 此外,我还希望受到编译器错误的保护,当将来我们添加一个新的参数类型时,响应参数解析器不会丢失 我想使用访问者设计模式,但我相信它不会起作用,因为ParameterType是一个枚举 型号: enum ParameterType { NAME, P

我从客户机收到给定参数类型和十六进制值的响应。根据参数类型,我知道它引用的参数类型,并且可以构建特定的参数

我想找到一种设计模式,使我能够摆脱显式参数类型检查:

if (paramType != reponse.paramType)
此外,我还希望受到编译器错误的保护,当将来我们添加一个新的参数类型时,响应参数解析器不会丢失

我想使用访问者设计模式,但我相信它不会起作用,因为ParameterType是一个枚举

型号:

enum ParameterType {
    NAME, 
    PHOTO,
    ...
    ;
}

class Response {
    ParameterType paramType;
    String value;
}

interface IParameter {}
 
class ParameterName implements IParameter {
    static ParameterType paramType = ParameterType.NAME;
    ParameterName fromReponse(response) {
        if (paramType != reponse.paramType) {
            throw new Exception();
        }
        return parse(response);
    }
    ParameterName parse();
}

class ParameterPhoto implements IParameter  { 
    static ParameterType paramType = ParameterType.PHOTO;
    ParameterPhoto fromReponse(response) {
        if (paramType != reponse.paramType) {
            throw new Exception();
        }
        return parse(response);
    }
    ParameterPhoto parse();
}   

...
服务:

ParameterName getParameterName() {
    var response = client.getName();
    var param = ParameterName.fromResponse(response);
    return param;
}

ParameterPhoto getParameterPhoto() {
    var response = client.getPhoto();
    var param = ParameterPhoto.fromResponse(response);
    return param;
}

....

干净的方法是让每个请求都有一个响应对象,就像您已经拥有的一样,然后让请求方法将响应数据解析到您的响应对象中并返回它。那么就不需要ParameterType枚举了


我看不到这里的访客模式

您需要的是工厂模式:

class ParameterFactory {
 public static IParameter getInstance(ParameterType paramType) {
   //Can use switch here if more options
   if (paramType==ParameterType.NAME) {
     return new NameParameter();
   } else {
     return new PhotoParameter();
    }
 }
}

我有多种参数类型,将来可能会更多。我正在寻找一种方法,当我添加一个新的参数类型时,如果我错过了新的参数impl,编译器将发出警告。我不确定if-chain或long-switch是否是一个好的解决方案。
switch
是如果您错过了新的参数impl开箱即用,则会给您一个错误的唯一方法。您可以在
default
分支中抛出一个错误。注意,这里的工厂示例是一个特别的示例,不要与GoF模式混淆。
class ParameterFactory {
 public static IParameter getInstance(ParameterType paramType) {
   //Can use switch here if more options
   if (paramType==ParameterType.NAME) {
     return new NameParameter();
   } else {
     return new PhotoParameter();
    }
 }
}