2014-09-05 11 views
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,这是我想要的。

+0

你为什么说“偏”? IIUC这里没有部分功能 – 2014-09-05 22:42:39

+0

@ItayMaman我错误地理解了部分功能的定义。编辑的问题。 – nobody 2014-09-05 22:48:55

回答

2

是的,通过反射进行双重调度是Java中访问者模式(以及其他支持自省的语言)的普通替代品。

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

相关问题