在某些情况下,访问者模式会创建不必要的复杂性和样板文件(许多accept方法),而完全泛化似乎对我来说是不可能的(accept()方法返回值也是如此)。因此,在我的情况下,我认为需要另一种解决方案。
当然,我不想创建很多if-else instanceof块,我希望找到一种聪明的方式将特定类型(例如列表中的)与方法匹配。
例如,guava在其EventBus中具有类似的功能,可以将特定类型的事件与@Subscribe注释方法匹配,因此我正在寻找一种类似的库,以通用的方式实现这一点。
以下是一个例子,我想要类似的东西:
神奇接口:
我的“访客”实现(应该自动调用正确的方法)。
我希望这是一个库(例如):
客户端代码:
当然,我不想创建很多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());
}