什么是Java领域模型?

37

我正在学习一本Spring书籍,他们提到了Java领域模型。
那是什么?

6个回答

41
一个领域模型(该术语并不是只针对Java的)是用于表示问题领域中某些内容的类,与仅出于技术实现原因而存在的类相对应。
领域模型实例通常需要持久化到数据库中,在Java中,它们通常符合JavaBean规范,即具有表示单个属性的get和set方法以及无参数构造函数。Spring和其他框架允许您直接在JSP中访问这些属性。
例如,在商店应用程序中,一些领域模型类可以是Product,Order,ShoppingCart和Customer。

1
“Persisted in database”这个词在通俗的语言中是什么意思? - John
2
@Name,这意味着它们的生命周期超出了包含它们的应用程序实例。例如,在商店应用关闭并重新启动后,它仍将识别您作为注册用户,并记住您购物车的内容和过去的订单。 - Péter Török
8
@Name:“persist”基本上意味着“保存”。 - Michael Borgwardt

10

领域模型是问题领域的概念模型。通过“Java领域模型”,他们只是指代表该模型的Java类。这个概念与Java无关。

另请参见领域驱动设计,了解一种将开发重点放在业务领域需求上的方法。


7

迈克尔·博格沃特的回答“领域模型(该术语与Java无关)是一个类”是错误的。我很惊讶有这么多人同意那个答案。

领域模型是所有模拟解决方案行为的类。它是实现所需行为的最小必要条件。领域模型不包含UI和持久性功能(除非问题围绕UI或持久性)。

我见过将领域模型实现在一个类中,但这不是面向对象解决方案的设计。在面向对象的领域模型中,每个概念都有自己的类来实现所需概念的行为,并包含维护类状态所需的必要字段。


3
“领域模型”这个术语有多个定义。它可以表示整个应用程序模型,也可以表示单个实体模型。具体取决于上下文。 - Dave Newton

5

让我们从一个例子开始。您正在创建一个应用程序,该应用程序将由您当地的某些人使用。在设计系统时,您称这些人为系统的用户。 您还必须管理这些人在系统中的角色列表和身份验证信息。因此,您决定在系统中创建一个概念实体。这个概念实体进一步映射到您软件解决方案(应用程序)中的一个User对象。现在,当您表示您的应用程序时,您将描述该User对象为域模型。这个术语背后的基本想法就是只有这样。您可以在以下维基百科链接中进一步阅读。


4
我知道自上次发布以来已经很长时间了。但是这个概念的信息清晰是很重要的。域模型通常是一组表示特定问题域的类。该概念与任何一种技术实现类型无关。我认为说:“域模型实例通常需要在数据库中持久化,在Java中,它们通常符合Java Beans规范,即它们具有获取和设置方法来表示单个属性和一个无参数构造函数。Spring和其他框架允许您直接在JSP中访问这些属性”是有点误导性的。
域模型通常是领域驱动设计的结果。领域驱动设计是一个良好而强大的域模型的关键。我建议阅读Eric Evans的《领域驱动设计》一书,以便更好地理解。
领域模型类确实与信息相关,但在这种情况下,行为比数据更重要。领域驱动设计中的一个大错误是创建数据类来表示领域实体(例如客户),仅为客户属性提供公共getter和setter。这些对象往往只是模仿数据库结构,因此实际业务逻辑更可能存在于领域服务中,导致贫血领域模型。该模型更接近于事务脚本而不是领域模型。

0
简单来说,您的域包是元素的对象表示,这些元素主要但不一定需要用于呈现UI字段,例如用户名、客户端信息、特定解决方案的pojos等。域包中包含的类将在DAO(数据访问对象)包中使用,其中dao将查询数据库并映射域中的这些类中的字段并返回它们。或者您可以使用像Hibernate这样的框架来返回此对象,其中像Hibernate这样的框架将负责处理查询DB。
这个答案更具有MVC和Java的特殊性,但详细介绍了可能的实现方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接