重载方法调度,没有访问者模式

时间:2014-09-05 22:36:47

标签: java overloading visitor-pattern

我想进行重载方法调度,访问者模式看起来太复杂了。

我的愚蠢思想提出了类似下面的东西,它有效。按照这样的方式可以吗?

界面

  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,这就是我想要的。

1 个答案:

答案 0 :(得分:2)

是的,通过反射的Double Dispatch是Java中访问者模式(以及支持内省的其他语言)的常见替代品。

但是,访问者模式对于让用户扩展封闭的层次结构仍然很有用,即向层次结构的所有类添加新的虚拟函数而不更改它们。