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