在Java中,我正在编写一些DTO对象,这些对象均从AllocationDTO继承。
然后将这些对象的列表传递到DAO对象中,以保存到数据库。

根据要保存的AllocationDTO子类型,保存逻辑会更改(例如,数据库中要保存到哪个表等)。

我发现自己使用这样的代码:

for (AllocationDTO x : listOfAllocationDtos) {
    if (x instanceof ManagerAllocationDTO) {
         Manager m = (x(ManagerAllocationDTO)).getManager();
         // save manager etc to managerallocs
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL1) {
         // save to specialAlloc1 table
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL2) {
         // save to specialAlloc2 table
    }
}


ManagerAllocationDTO有一个额外的字段,用于将分配分配给管理器,但是对于specialalloc1 / 2情况,我没有创建子类型,因为数据中唯一的区别是保存到的表。

我的问题是一个软设计问题-这是实现此目标的最佳方法吗?

最佳答案

在没有instanceOf和if-else-cascade的情况下分离不同实例的一种方法是使用Visitor Design pattern


新接口:AllocationVisitor,对AllocationDTO的每个具体子类使用一种方法:


访问(TYPE_SPCIAL1 dto)
访问(TYPE_SPCIAL2 dto)

AllocationDTO:抽象void acceptVisitor(AllocationVisitor visitor)
AllocationDTO的每个concreate子类都通过以下方式实现acceptVisitor():
void acceptVisitor(AllocationVisitor visitor){visit(this);} //根据编译时间类型选择正确的访问方法。
您的DTO实现AllocationVisitor接口(带有一个内部类),创建它的一个实例,并将其传递给listOfAllocationDtos的元素。


DAO:

AllocationVisitor saveVisitor = new AllocationVisitor() {
  visit(TYPE_SPCIAL1 dto) {//what ever you need}
  visit(TYPE_SPCIAL2 dto) {//what ever TYPE_SPCIAL2 needs}
}
for (AllocationDTO x : listOfAllocationDtos) {
  x.visit(saveVisitor);
}

10-06 09:31