访客的抽象类 - 类似于typeOf

时间:2017-09-20 08:14:31

标签: java design-patterns abstract-class typeof visitor

我很困惑如何避免在我的经理方法(代码的最后一段)中使用套管,最终使用派生类(实体)和访客设计模式。下面我有一个名为BaseEntity的实体的抽象类。这不是一个真实的例子,只是伪代码。

public abstract class BaseEntity {

    @Reference
    protected List<String> items = new ArrayList<>();

    public BaseEntity() {
    }

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }
}

下面我有来自抽象类的3个派生类。

@Entity("CollectionA")
public class EntityA extends BaseEntity {
    //code
}

@Entity("CollectionB")
public class EntityB extends BaseEntity {
    //code
}

@Entity("CollectionC")
public class EntityC extends BaseEntity {
    //code
}

然后我创建了一个访问者,以便在我的经理中重复使用,以避免使用instanceOf。

public interface UpdateEntityVisitor {

    void create(EntityA entityA);

    void create(EntityB entityB);

    void create(EntityC entityC);
}

public class UpdateEntityVisitorImpl implements UpdateEntityVisitor {

    private final Factory factory;

    public UpdateEntityVisitorImpl() {
        factory = new FactoryImpl();
    }

    public UpdateEntityVisitorImpl(Factory factory) {
        this.factory = factory;
    }

    @Override
    public void create(EntityA entityA) {
        factory.getEntityA().create(entityA);
    }

    @Override
    public void create(EntityB entityB) {
        factory.getEntityB().create(entityB);
    }

    @Override
    public void create(EntityC entityC) {
        factory.getEntityC().create(entityC);
    }
}

最后,我的经理类有以下方法,我想避免从BaseEntity转到适当的类。有一种方法可以实现在经理中重复使用访客类吗?

public void updateEntity(BaseEntity entity) {
    if (checkSmth()) {
        updateCollectionA((EntityA) entity);
    } else {
        updateCollectionB((EntityB) entity);
    }
}

我发现这个名为typeOf https://github.com/nurkiewicz/typeof的非常有用的库,但我想知道是否有其他方法可以让我现在的团队更清楚。

1 个答案:

答案 0 :(得分:0)

使用泛型是否有效?

public <T extends BaseEntity> void updateEntity(T entity)
{
    if (checkSmth())
        updateCollectionA(entity);
    else 
        updateCollectionB(entity);
}