查询对象和规范模式之间的差异

时间:2013-05-28 20:32:49

标签: design-patterns domain-driven-design poeaa

Martin Fowler提出的查询对象模式与Eric Evans提出的规范模式有什么区别?

2 个答案:

答案 0 :(得分:5)

查询对象

Fowler's Query Object patternPatterns of Enterprise Application Architecture p.316)是the Interpreter pattern的特化,允许以域语言呈现数据库查询。一个主要来自福勒的例子:

QueryObject query = new QueryObject(Person.class);
query.addCriteria(Criteria.greaterThan("numberOfDependents", 0))
List<Person> persons = query.execute(unitOfWork);

Java Persistence API Criteria API和Rails'ActiveRecord query interface就是这种模式的例子。

规范

Evans' Specification patternDomain-Driven Design p.224)将业务规则实现为表示另一个对象,实体或值对象的谓词的对象。 Evans的示例是一个带有布尔方法InvoiceDelinquency的{​​{1}}对象,如果test(Invoice)是拖欠的,则返回true。规范可用于以下几个方面:验证对象,查询集合或指定如何创建新对象。

差异

规范与作为查询对象模式一部分的Criteria类基本相同。查询对象描述并不打算将Criteria用于除指定查询之外的任何其他目的,但如果您在同一程序中使用这两种模式,那么您当然希望将规范用作查询对象的标准。

答案 1 :(得分:1)

规范模式的实现往往更窄。他们回答了与您的域名相关的特定问题。例如,这个规范完全致力于某些电影是否适合孩子:

var spec = new MovieForKidsSpecification();

if (!spec.IsSatisfiedBy(movie))
    return Error(“The movie is not eligible for children”);

查询对象是一种更广泛的模式,不仅可用于回答域模型带来的问题。您可以将查询对象视为超级规范集。以下是在我的博客中实施规范模式的示例:Specification pattern implementation