从列表中获取处理案例的服务



我有一些实现接口的处理程序。每个处理程序应根据一种或多种类型处理某些情况。我通过自动连线获取该处理程序的列表。因此,当我想在迭代它们并检查其中一些是否处理案例时,如果是这样,我会在案例上运行它。正如这里描述的 -

@Service
public class CarCreator implments ICreator{
   @Override
   public boolean shouldServe(IEntity entity){
     entity.getType().equal(Type.Car);
   }
   @Override
   public boolean crate(IEntity entity){ .. some code ...}
}

@Service
public class HouseCreator implments ICreator{
   @Override
   public boolean shouldServe(IEntity entity){
     entity.getType().equal(Type.House);
   }
   @Override
   public boolean crate(IEntity entity){ .. some code ...}
}

@Service
public class AnimalCreator implments ICreator{
   @Override
   public boolean shouldServe(IEntity entity){
     entity.getType().equal(Type.Animal);
   }
   @Override
   public boolean crate(IEntity entity){ .. some code ...}
}

interface ICreator{
   boolean shouldServe(IEntity entity);

   public boolean crate(IEntity entity);
}

public void EntitiesCreatorManger{
   List<ICreator> creators;
   @Autowired
   public EntitiesCreatorManger(List<ICreator> creators){ this.creators = creators;}
   public void createEntities(List<IEntity> entitites){
     entities.stream.forEach(entity-> {
        for(ICreator creator : creators){
             if(creator.shouldServe(entity){
                  creator.create(entity);
                  break;
             }
        }
   }
}

我想以更优雅的方式做到这一点,而不是像这样使用系统中的每个接口列表。有这样的办法吗?

将所有ICreator放在查找图中:

Map<IEntity, ICreator> map = ...
ICreator creator = map.get(entity);
if(creator != null) {
...}

您似乎有类型的枚举。将创建逻辑移动到枚举实例上,并委托给对该类型的create()调用。

public enum Type implements ICreator {
    Car {
        @Override
        public void create(IEntity entity) {
            // car creation
        }
    }, 
    House {
        @Override
        public void create(IEntity entity) {
            // house creation
        }
    }, 
    Animal{
        @Override
        public void create(IEntity entity) {
            // animal creation
        }
    };
}
public void EntitiesCreatorManager{
   public void createEntities(List<IEntity> entities){
     entities.forEach(entity -> entity.getType().create(entity));
   }
}

相关内容

最新更新