1
我想做重载的方法调度和访问者模式看起来太复杂。重载的方法调度,没有访客模式
我的愚蠢的想法产生了像下面这样的东西,它的工作原理。遵循这样的事情可以吗?
接口
public interface Value {
default public Integer getValue(){
return 1;
}
}
一个可以具有多个类型的值的接口,例如像下面2个值接口实现。
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,这是我想要的。
你为什么说“偏”? IIUC这里没有部分功能 – 2014-09-05 22:42:39
@ItayMaman我错误地理解了部分功能的定义。编辑的问题。 – nobody 2014-09-05 22:48:55