Martin Fowler 提出的 Query Object 模式和 Eric Evans 提出的 Specification 模式有什么区别?
2 回答
查询对象
Fowler 的查询对象模式(企业应用程序架构模式第 316 页)是解释器模式的一种特殊化,它允许数据库查询以领域语言呈现。一个主要来自福勒的例子:
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查询接口就是这种模式的例子。
规格
Evans 的规范模式( Domain-Driven Design p. 224) 将业务规则实现为一个对象,该对象表示另一个对象、实体或值对象的谓词。Evans 的示例是一个InvoiceDelinquency
带有布尔方法的对象,如果它是拖欠的,则test(Invoice)
返回 true 。Invoice
规范可用于多种用途:验证对象、查询集合或指定如何创建新对象。
区别
规范本质上与作为查询对象模式一部分的 Criteria 类相同。查询对象描述并不打算让 Criteria 有任何其他目的,而不是指定查询,但是如果您在同一个程序中使用这两种模式,您肯定希望使用您的 Specifications 作为查询对象的 Criteria。
规范模式的实现往往更窄。他们回答与您的域相关的特定问题。例如,此规范完全致力于某些电影是否适合儿童:
var spec = new MovieForKidsSpecification();
if (!spec.IsSatisfiedBy(movie))
return Error(“The movie is not eligible for children”);
查询对象是一种更广泛的模式,不仅可以用于回答您的域模型提出的问题。您可以将查询对象视为规范的超集。这是我博客中实现规范模式的示例:规范模式实现