【发布时间】:2016-05-13 16:30:08
【问题描述】:
在某些情况下,访问者模式会产生不必要的复杂性和样板(许多接受方法),并且在我看来完全概括是不可能的(accept() 方法也返回值)。所以我认为在我的情况下是另一种解决方案。
我当然不想创建很多 if-else instanceof 块,我想找到一种聪明的方法来匹配特定类型(例如在列表中)与方法。
例如 guava 在其EventBus 中具有类似的功能,可以将特定类型的事件与@Subscribe 注释的方法进行匹配,因此我正在寻找一个类似的库,以便在一般方式。
这是一个例子,我想要类似的东西:
神奇的界面:
/** @param <R> - return type * @param <I> - element super type */
public interface MagicDoubleDispatch<R, I>{
R dispatch(I element);
}
我的“访客”实现(应该自动调用正确的方法)
public class EventFormatter extends MagicDoubleDispatchImpl<String, Event> {
private String format(AddedEmployeeEvent event) {
return String.format("Added new employee: %s with id %s", event.name, event.employeeId);
}
private String format(DeletedEmployeeEvent event) {
return String.format("Deleted employee:(%s) %s (this can't be undone!)", event.employeeId, event.name);
}
private String format(AddedTimeCardEvent event) {
return String.format("Timecard of %s has been added to %s", event.date, event.employeeName);
}
}
我想要这个作为一个库(例如):
public abstract class MagicDoubleDispatchImpl<R, I> implements MagicDoubleDispatch<R, I> {
//I want this ... probably using reflection as EventBus, I don't care..
}
客户端代码:
private EventFormatter eventFormatter = new EventFormatter();
public List<String> toStringList(List<Event> events) {
return events.stream()
.map(it -> eventFormatter.dispatch(it))
.collect(Collectors.toList());
}
【问题讨论】:
-
为什么不用番石榴?
-
出于同样的原因,我写了this。它旨在用作碰撞系统,但我认为它能够以更通用的方式使用。
-
Aglassaman:是的,如果可能的话,我想使用番石榴,但不使用 eventbus,因为这是针对特定功能的,我想要一种更通用的双重调度方式
-
ChiefTwoPencils:我很好奇你的图书馆,有什么例子吗?
标签: java guava visitor-pattern