但在特定情况下,我有活动对象(不知道它是哪个子类)并且必须编写一个对所有实体对象都不同的方法。
只需将基类抽象化并定义每个子类必须实现的抽象方法即可:
public abstract class ActivityService{
public abstract Foo processEntity(Entity entity);
}
问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,不是服务,我不能做任何硬编码)
这是您应该尽量避免的情况。通常,您应该只将实体发送到知道如何处理它的服务,而不是发送到一堆服务,其中一个是负责的。但是我要做的是使用一个调度服务来保存服务负责的类的映射。它使用这样的逻辑:
private Map<Class<? extends Entity>,
Class<? extends ActivityService>> serviceMap =
new ConcurrentHashMap<Class<? extends Entity>,
Class<? extends ActivityService>>();
private ApplicationContext context;
private ActivityService getServiceForEntity(Entity e){
Class<? extends Entity> entityClass = e.getClass();
Class<? extends ActivityService> serviceClass =
serviceMap.get(entityClass);
if(serviceClass==null){
for(Map.Entry<Class<? extends Entity>,
Class<? extends ActivityService>> entry :
serviceMap.entrySet()){
if(entry.getKey().isAssignableFrom(entityClass)){
serviceClass = entry.getValue();
break;
}
}
if(serviceClass==null){
// throw a suitable exception
}
serviceMap.put(entityClass, serviceClass);
}
return context.getBean(serviceClass);
}