我想进行重载方法调度,访问者模式看起来太复杂了。
我的愚蠢思想提出了类似下面的东西,它有效。按照这样的方式可以吗?
界面
public interface Value {
default public Integer getValue(){
return 1;
}
}
可以有多种类型的Value接口,例如下面的两个Value接口实现。
class ConcreteValueA implements Value {
@Override
public Integer getValue() {
return 2;
}
}
class ConcreteValueB implements Value {
@Override
public Integer getValue() {
return 3;
}
}
以及具有下面重载方法的服务实现,这些方法根据输入类型执行操作。
public class ImplA implements Interface{
private final Function<ConcreteValueA, Optional<String>> handleConcreteA = this::handle;
private final Function<ConcreteValueB, Optional<String>> handleConcreteB = this::handle;
private final Map<Class<? extends Value>, Function> functions;
public ImplA(){
functions = new HashMap<>();
functions.put(ConcreteValueA.class, handleConcreteA);
functions.put(ConcreteValueB.class, handleConcreteB);
}
/**
* Overridden method
*/
@Override
public Optional<String> handle(Value input) {
Function function = functions.get(input.getClass());
return (Optional<String>)function.apply(input);
}
/**
* Overloaded method A
*/
public Optional<String> handle(ConcreteValueA input) {
return Optional.of(input.getValue()+":A");
}
/**
* Overloaded method B
*/
public Optional<String> handle(ConcreteValueB input) {
return Optional.of(input.getValue()+":B");
}
/**
* Test method
*/
public static void main(String [] args){
Interface service = new ImplA();
Value input = new ConcreteValueB();
Optional<String> optional = service.handle(input);
System.out.println(optional.orElse("Default"));
}
}
打印3:B,这就是我想要的。
答案 0 :(得分:2)
是的,通过反射的Double Dispatch是Java中访问者模式(以及支持内省的其他语言)的常见替代品。
但是,访问者模式对于让用户扩展封闭的层次结构仍然很有用,即向层次结构的所有类添加新的虚拟函数而不更改它们。