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();
}
}
}