`
soleghost
  • 浏览: 41858 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论

领域模型分类

阅读更多

一、失血模型
只有getter和setter方法的实体类,所有的业务逻辑完全由Service层来完成。

代码示例:
Domain:

Java代码

 

public class Person {
    private long   id;
    private String name;
    private int    age;

   //getter and setter …
}


DAO接口:

Java代码

 

public interface PersonDAO {
    public Person findPersonById(long id);
}


DAO实现:

Java代码

 

public class IbatisPersonDAO implements PersonDAO {

    private SqlMapClientTemplate sqlMapClientTemplate = new SqlMapClientTemplate();

    public Person findPersonById(long id) {
        return (Person) sqlMapClientTemplate.queryForObject("MS-PERSON-FIND-PERSON-BY-ID", id);
    }
}


Service层:

Java代码
public class PersonService {

    private IbatisPersonDAO ibatisPersonDAO;

    public Person findPersonInfo(long id) {
        return ibatisPersonDAO.findPersonById(id);
    }

    public void setIbatisPersonDAO(IbatisPersonDAO ibatisPersonDAO) {
        this.ibatisPersonDAO = ibatisPersonDAO;
    }
}


二、贫血模型
领域对象包含不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。

示例代码:
Domain:

Java代码
public class Person {

    private long   id;
    private String name;
    private int    age;

    public void modifyPerson(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    //getter and setter ...
} 


Service层:

Java代码 
public class PersonService {

    private IbatisPersonDAO ibatisPersonDAO;

public void modifyPersonInfo(long id,String name,int age) {
	Person person = new Person();
	person. modifyPerson(id,name,age);
        ibatisPersonDAO.updatePersonById(person);
    }

    public void setIbatisPersonDAO(IbatisPersonDAO ibatisPersonDAO) {
        this.ibatisPersonDAO = ibatisPersonDAO;
    }
}


三、充血模型
绝大部分业务逻辑被放在领域对象中(包括持久化逻辑),而Service层仅仅封装事务和少量逻辑,不调用DAO层。

示例代码:
Domain:

Java代码
public class Person {

    private long            id;
    private String          name;
    private int             age;
    private IbatisPersonDAO ibatisPersonDAO;

public void modifyPerson(long id,String name,int age) {
	this.id = id;
	this.name = name;
	this.age = age;
        ibatisPersonDAO.updatePersonById(this);
    }

    //getter and setter ...
}


Service层:

Java代码 
public class PersonService {

    public void modifyPersonInfo(long id, String name, int age) {
        Person person = new Person();
        person.modifyPerson(id,name,age);
    }

}


四、胀血模型
去掉Service层,只保留领域对象。

示例代码:
Domain:

Java代码  
public class Person {

    private long            id;
    private String          name;
    private int             age;
    private IbatisPersonDAO ibatisPersonDAO;

    public void modifyPerson(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
        ibatisPersonDAO.updatePersonById(this);
    }

    //getter and setter ...
}

 

引用


失血模型和胀血模型是不被提倡的,推荐使用贫血模型。

失血模型缺点:
无任何业务逻辑的纯实体类

胀血模型缺点:
1、很多不是领域对象的业务逻辑也被强行放入领域对象,导致领域对象不稳定
2、暴露给web层过多的领域对象信息

充血模型缺点:
考虑到Service层的事务封装特性,Service层必须对所有领域对象的逻辑提供相应的事务封装方法,其结果就是Service层完全重定义一遍所有的领域对象。而且Service层的事务化封装其意义就等于把OO的领域对象转换为过程的Service TransactionScript。该充血模型在Domain层实现的OO在Service层又变成了过程式,从Web层程序员的角度来看,和贫血模型没有区别

贫血模型优点:
1、各层单向依赖,结构清楚,易于实现和维护
2、设计简单易行,底层模型非常稳定

分享到:
评论

相关推荐

    UML 领域模型介绍

    ### UML领域模型介绍 #### 一、领域模型概述 UML(Unified Modeling Language,统一建模语言)是一种广泛应用于软件工程领域的图形化语言,用于描述系统的结构和行为。领域模型是UML中的一个重要概念,它主要关注...

    java领域模型代码示例

    在软件开发中,领域模型(Domain Model)是根据业务领域中的概念、规则和逻辑构建的抽象模型,它是领域驱动设计(Domain-Driven Design,简称DDD)的核心组成部分。领域模型能够帮助我们更好地理解和表达复杂的业务...

    数学建模 中的 模型分类

    以下将详细介绍根据描述和标签提及的几种模型分类: 1. **按应用领域分类**: - 生物学数学模型:用于研究生物系统的结构和功能,如种群动态、基因表达调控等。 - 医学数学模型:在疾病传播、药物动力学、生理...

    基于MMCV框架的多分类模型架构

    多分类问题是指模型需要从多个类别中预测一个目标类别,常见于图像识别、文本分类等领域。MMCV中的分类模型架构设计灵活且高效,支持多种预训练模型和自定义网络结构。 首先,MMCV支持常见的预训练模型,如ResNet、...

    人工智能-项目实践-意图识别-使用bert做领域分类、意图识别和槽位填充任务.zip

    在本项目实践中,我们将深入探讨如何利用BERT模型进行人工智能中的意图识别和自然语言理解任务,包括领域分类、意图识别以及槽位填充。BERT,全称为Bidirectional Encoder Representations from Transformers,是由...

    基于BERT模型的科技政策文本分类研究.pdf

    "基于BERT模型的科技政策文本分类研究" 本研究旨在探索基于BERT模型的科技政策文本分类方法,以降低人工处理的成本,提高政策匹配的效率。通过对科技政策文本数据进行自动分类,利用BERT深度学习模型,结合TextRank...

    图像分类 - 图像分类经典模型_files_经典图像分类模型_

    最后,我们不能忽视YOLO(You Only Look Once)和SSD(Single Shot Multibox Detector)这两款在目标检测领域的经典模型,它们将分类和定位结合在一起,实现了实时的图像分类和对象检测。 以上这些模型不仅在学术界...

    按模型分类美赛优秀论文.zip

    【标题】:“按模型分类美赛优秀论文.zip” 在数学建模领域,美国大学生数学建模竞赛(MCM/ICM)是一项具有极高影响力的国际赛事,吸引了全球各地的学生参与。"按模型分类美赛优秀论文.zip"这个压缩包文件正是为...

    贝叶斯分类算法/伯努利模型/多项式模型

    总的来说,贝叶斯分类算法及其变体如伯努利模型和多项式模型,是数据科学和机器学习领域中不可或缺的工具,它们在许多实际问题中都表现出良好的性能。理解并掌握这些模型对于解决分类问题至关重要。

    论文研究-基于领域本体的用户模型的研究.pdf

    针对该方法不包含语义信息,很难准确表示用户感兴趣的信息,并且难于扩展,提出一种基于领域本体的用户模型。该模型利用用户访问量,采用改进的相似度算法,实现用户分类建立用户模型,体现用户个人偏好。最后将该...

    自动分类模型及算法研究.rar_分类模型_分类算法_文件分类_自动分类

    在IT领域,自动分类模型和算法是数据科学与机器学习中的关键组成部分,它们主要用于处理大量信息,特别是文本数据,如文档。在这个主题中,我们主要关注如何利用机器学习技术自动将文件分类到预定义的类别中,从而...

    基于python面向工业用途使用BERT模型做文本分类项目实现

    本项目专注于使用Python编程语言以及BERT(Bidirectional Encoder Representations from Transformers)模型进行文本分类,这是一个强大的预训练语言模型,对于理解和处理自然语言具有出色的能力。以下是关于这个...

    DNA序列的分类模型.pdf数学建模

    DNA 序列分类模型.pdf 数学建模 本资源是关于 DNA 序列分类模型的数学建模,讨论了基于三个不同的角度来分类 DNA 序列。第一种方法基于碱基出现频率的不同,第二种方法考虑同一碱基在序列中的间隔,第三种方法将 ...

    基于Word2vec和LDA的卷积神经网络文本分类模型.pdf

    基于 Word2vec 和 LDA 的卷积神经网络文本分类模型 本文提出了一种结合 Word2vec 和 LDA 的文本特征表示模型,该模型能够有效地表示单词的语义特征和上下文特征,...该模型可以应用于自然语言处理领域的文本分类任务。

    通过二分类来比较神经网络模型和逻辑回归模型

    在机器学习领域,二分类是将数据分为两个类别的一种常见任务,例如判断一封邮件是否为垃圾邮件、预测用户是否会购买某个产品等。本主题将深入探讨两种常用的二分类模型:神经网络模型和逻辑回归模型,并通过...

    Transformer模型应用领域

    Transformer 模型应用领域 Transformer 模型是一种基于注意力机制的神经网络架构,最初被提出用于自然语言处理任务中的序列到序列学习。随着时间的推移,Transformer 模型被应用于各种不同的领域,例如自然语言处理...

    基于体素模型与卷积神经网络的三维模型分类算法.pdf

    三维模型分类是计算机图形学和机器学习领域中的一个重要研究方向,它在CAD设计、虚拟现实、自动驾驶等多个领域都有广泛应用。传统三维模型分类算法面临的主要挑战是时间复杂度高和分类准确性低,这限制了它们在大...

    猫狗数据集;用于训练猫狗二分类模型

    用于训练猫狗二分类模型”是深度学习领域的一个基础案例,它涵盖了数据预处理、模型构建、训练、评估与优化以及模型部署等核心步骤。通过解决这个问题,开发者不仅可以掌握深度学习的基本流程,还能进一步理解图像...

Global site tag (gtag.js) - Google Analytics