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