Martin Fowler提出的查询对象模式与Eric Evans提出的规范模式有什么区别?
答案 0 :(得分:5)
Fowler's Query Object pattern(Patterns 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 pattern(Domain-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