类似查询的设计模式

时间:2018-08-05 04:35:14

标签: java design-patterns

我有一个类,它具有几种具有类似目的的方法:从另一个API获取联系信息。

界面如下:

interface ContactDao {
   Contact getContactById(int contactId);
   Contact getContactByContactGroup(int contactGroupId);
}

是否有一种设计模式或解决方案来减少获取联系人的方法?

到目前为止,我已经提到https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/

1 个答案:

答案 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;
    }

}

这是简单的示例。您可以构建更复杂的条件->谓词(例如日期范围等)