我有一个类,它具有几种具有类似目的的方法:从另一个API获取联系信息。
界面如下:
interface ContactDao {
Contact getContactById(int contactId);
Contact getContactByContactGroup(int contactGroupId);
}
是否有一种设计模式或解决方案来减少获取联系人的方法?
到目前为止,我已经提到https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/。
答案 0 :(得分:1)
您可以使用“选择条件”对象。
public class ContactCriteria {
private Integer type;
private Integer val;
public Integer getType() {
return type;
}
public Integer getVal() {
return val;
}
}
interface ContactDao {
Optional<Contact> getContact(ContactCriteria criteria);
List<Contact> getContacts(ContactCriteria criteria);
}
构建查询时,请检查给定条件是否存在,如果为true,则构建相应的查询谓词(使用某种查询构建工具)。谓词与AND结合在一起。下面的示例基于QueryDSL:
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Predicate;
public class ContactPredicate {
private static QContact contact = QContact.contact;
private ContactPredicate() {}
public static Predicate forCriteria(ContactCriteria criteria) {
BooleanBuilder predicate = new BooleanBuilder();
if (criteria.getType() != null) {
predicate.and(contact.type.eq(criteria.getType()));
}
if (criteria.getVal() != null) {
predicate.and(contact.val.eq(criteria.getVal()));
}
return predicate;
}
}
这是简单的示例。您可以构建更复杂的条件->谓词(例如日期范围等)