领域模型 贫血模型 充血模型

http://blog.darkmi.com/2011/12/21/2069.html

领域模型

领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。 业务对象模型 (也叫领域模型 domain model) 是描述业务用例实现的对象模型。它是对业务角色和业务实体之间应该如何联系和协作以执行业务的一种抽象。业务对象模型从业务角色内部的观点定义了业务用例。该模型为产生预期效果确定了业务人员以及他们处理和使用的对象 (“业务类和对象”) 之间应该具有的静态和动态关系。它注重业务中承担的角色及其当前职责。这些模型类的对象组合在一起可以执行所有的业务用例。

贫血模型 (Anemic Model) Anemic Domain Model (贫血领域模型), 贫血领域对象

Martin Fowler在他个人博客里描述的一个Anti-pattern 反模式 是 Anemic Domain Model (贫血域模型), 但是,恰恰这种 Anti-pattern 反模式,却在实际应用中频繁出现。

是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。

贫血领域对象 (Anemic Domain Object)是指仅用作数据载体,而没有行为和动作的领域对象。

贫血领域对象只是个数据载体,没有任何行为。简单的业务系统采用这种贫血模型和过程化设计是没有问题的,但在业务逻辑复杂了,业务逻辑、状态会散落到在大量方法中,原本的代码意图会渐渐不明确,我们将这种情况称为由贫血症引起的失忆症。

充血模型

层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client-> (Business Facade)->Business Logic->Domain Object->Data Access。

参考资料:

http://baike.baidu.com/view/757895.htm

http://www.uml.org.cn/mxdx/200803141.asp

http://www.oschina.net/question/54100_10400

作者: 郭凛 链接: https://www.zhihu.com/question/20360521/answer/14891150 来源: 知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

贫血模型最早广泛应用是源自于EJB2,最强盛时期则是由Spring创造,把"行为” (也称为逻辑、过程) 和"状态” (可理解为数据,对应到语言就是对象成员变量) 分离到不同的对象之中,那个只有状态的对象就是所谓的"贫血对象” (常称为VO——Value Object) ,而那个只有行为的对象就是我们常见的N层结构中的Logic/Service/Manager层 (对应到EJB2中的Stateless Session Bean) 。 (曾经Spring的作者Rod Johnson也承认,Spring不过是在沿袭EJB2时代的"事务脚本”,也就是面向过程编程) 充血模型其实很简单,就是面向对象设计的本质: “一个对象是拥有状态和行为的”,比如说一个人,他眼睛什么样鼻子什么样这就是状态,人可以去打游戏或是写程序,这就是行为。为什么要有一个"人Manager"这样的东西存在去帮人"打游戏"呢?举个简单

的J2EE的例子,设计一个与用户 (User) 相关的功能,传统的设计一般是: 类: User+UserManager 保存用户调用: userManager.save(User user); 充血的设计则可能会是: 类: User 保存用户调用: user.save(); ——User有一个行为是: 保存它自己

  http://www.ituring.com.cn/article/125



  http://www.infoq.com/cn/articles/cjq-ddd



  http://www.blogjava.net/GandofYan/archive/2006/05/30/48954.html