在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);
}