内容简介:使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
问题
您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。
动因
- 您希望以集中方式封装业务逻辑,并防止在客户端中实现它。
- 您希望在构建业务层对象模型的数据表示时,对远程对象的网络调用最小化。
- 您希望创建一个复杂的模型以交给客户端以进行演示。
- 您希望客户端独立于模型实现的复杂性,并且希望减少客户端与业务组件之间的耦合。
解决方案
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
结构
让我们使用UML类图来显示解决方案的基本结构,本节中的UML序列图介绍了解决方案的动态机制。
类图
序列图
参与者与职责
客户端 - 客户端调用TransferObjectAssembler以获取应用程序模型数据。客户端可以是表示层的组件,也可以是会话面,为访问TransferObjectAssembler的客户端提供远程访问层。
TransferObjectAssembler - TransferObjectAssembler是此模式的主要类。当客户端请求应用程序模型数据时,TransferObjectAssembler根据应用程序的要求构造一个新的复合传输对象。
ApplicationModel- ApplicationModel对象是由TransferObjectAssembler构造并返回到客户端的复合传输对象。
BusinessObject- BusinessObject表示业务对象,它向TransferObjectAssembler提供传输对象以组装应用程序模型。
SessionFacade - 该SessionFacade表示会话外观,它提供了构建applicationmodel传输对象所需的部分数据。
DataAccessObject - DataAccessObject表示数据访问对象,当TransferObjectAssembler需要直接从持久存储中获取数据时使用。
Service - 服务是任意服务对象,包括业务层中的应用程序服务,它提供构造ApplicationModel对象所需的数据。
实现传输对象汇编程序
考虑一个 项目管理应用程序 ,其中许多业务层组件定义了复杂模型。假设客户想要获取模型
数据来自于各种业务对象的数据组合,例如:
- 项目组件的项目信息
- ProjectManager组件中的 项目经理信息
- 项目组件中 的项目任务列表
- 资源组件中的资源信息。
第1步: 创建复合传输对象类
可以实现一个传输对象组装器模式来组装该复合传输对象。
<b>public</b> <b>class</b> ProjectDetailsData {
<b>private</b> ProjectTO projectData;
<b>private</b> ProjectManagerTO projectManagerData;
<b>private</b> Collection < TaskResourceTO > listOfTasks;
<b>public</b> ProjectDetailsData(ProjectTO projectData, ProjectManagerTO projectManagerData,
Collection < TaskResourceTO > listOfTasks) {
<b>super</b>();
<b>this</b>.projectData = projectData;
<b>this</b>.projectManagerData = projectManagerData;
<b>this</b>.listOfTasks = listOfTasks;
}
}
ProjectDetailsData中的任务列表是TaskResourceTo对象的集合。taskResourceTo是taskTo和resourceTo的组合。
第2步: 创建ResourceTo、TaskTo、ProjectTo和ProjectManager以传输对象类。
<b>public</b> <b>class</b> ResourceTO {
<b>private</b> String resourceId;
<b>private</b> String resourceName;
<b>private</b> String resourceEmail;
<b>public</b> String getResourceId() {
<b>return</b> resourceId;
}
<b>public</b> <b>void</b> setResourceId(String resourceId) {
<b>this</b>.resourceId = resourceId;
}
<b>public</b> String getResourceName() {
<b>return</b> resourceName;
}
<b>public</b> <b>void</b> setResourceName(String resourceName) {
<b>this</b>.resourceName = resourceName;
}
<b>public</b> String getResourceEmail() {
<b>return</b> resourceEmail;
}
<b>public</b> <b>void</b> setResourceEmail(String resourceEmail) {
<b>this</b>.resourceEmail = resourceEmail;
}
}
<b>public</b> <b>class</b> TaskTO {
<b>private</b> String projectId;
<b>private</b> String taskId;
<b>private</b> String name;
<b>private</b> String description;
<b>private</b> Date startDate;
<b>private</b> Date endDate;
<b>private</b> String assignedResourceId;
<b>public</b> String getProjectId() {
<b>return</b> projectId;
}
<b>public</b> <b>void</b> setProjectId(String projectId) {
<b>this</b>.projectId = projectId;
}
<b>public</b> String getTaskId() {
<b>return</b> taskId;
}
<b>public</b> <b>void</b> setTaskId(String taskId) {
<b>this</b>.taskId = taskId;
}
<b>public</b> String getName() {
<b>return</b> name;
}
<b>public</b> <b>void</b> setName(String name) {
<b>this</b>.name = name;
}
<b>public</b> String getDescription() {
<b>return</b> description;
}
<b>public</b> <b>void</b> setDescription(String description) {
<b>this</b>.description = description;
}
<b>public</b> Date getStartDate() {
<b>return</b> startDate;
}
<b>public</b> <b>void</b> setStartDate(Date startDate) {
<b>this</b>.startDate = startDate;
}
<b>public</b> Date getEndDate() {
<b>return</b> endDate;
}
<b>public</b> <b>void</b> setEndDate(Date endDate) {
<b>this</b>.endDate = endDate;
}
<b>public</b> String getAssignedResourceId() {
<b>return</b> assignedResourceId;
}
<b>public</b> <b>void</b> setAssignedResourceId(String assignedResourceId) {
<b>this</b>.assignedResourceId = assignedResourceId;
}
}
<b>public</b> <b>class</b> TaskResourceTO {
<b>private</b> String projectId;
<b>private</b> String taskId;
<b>private</b> String name;
<b>private</b> String description;
<b>private</b> Date startDate;
<b>private</b> Date endDate;
<b>private</b> TaskResourceTO assignedResource;
<b>public</b> String getProjectId() {
<b>return</b> projectId;
}
<b>public</b> <b>void</b> setProjectId(String projectId) {
<b>this</b>.projectId = projectId;
}
<b>public</b> String getTaskId() {
<b>return</b> taskId;
}
<b>public</b> <b>void</b> setTaskId(String taskId) {
<b>this</b>.taskId = taskId;
}
<b>public</b> String getName() {
<b>return</b> name;
}
<b>public</b> <b>void</b> setName(String name) {
<b>this</b>.name = name;
}
<b>public</b> String getDescription() {
<b>return</b> description;
}
<b>public</b> <b>void</b> setDescription(String description) {
<b>this</b>.description = description;
}
<b>public</b> Date getStartDate() {
<b>return</b> startDate;
}
<b>public</b> <b>void</b> setStartDate(Date startDate) {
<b>this</b>.startDate = startDate;
}
<b>public</b> Date getEndDate() {
<b>return</b> endDate;
}
<b>public</b> <b>void</b> setEndDate(Date endDate) {
<b>this</b>.endDate = endDate;
}
<b>public</b> TaskResourceTO getAssignedResource() {
<b>return</b> assignedResource;
}
<b>public</b> <b>void</b> setAssignedResource(TaskResourceTO assignedResource) {
<b>this</b>.assignedResource = assignedResource;
}
}
<b>public</b> <b>class</b> ProjectManagerTO {
<b>private</b> String name;
<b>private</b> String address;
<b>private</b> String projects;
<b>public</b> String getName() {
<b>return</b> name;
}
<b>public</b> <b>void</b> setName(String name) {
<b>this</b>.name = name;
}
<b>public</b> String getAddress() {
<b>return</b> address;
}
<b>public</b> <b>void</b> setAddress(String address) {
<b>this</b>.address = address;
}
<b>public</b> String getProjects() {
<b>return</b> projects;
}
<b>public</b> <b>void</b> setProjects(String projects) {
<b>this</b>.projects = projects;
}
}
<b>public</b> <b>class</b> ProjectTO {
<b>private</b> String projectId;
<b>private</b> String projectName;
<b>private</b> String projectDesc;
<b>public</b> String getProjectId() {
<b>return</b> projectId;
}
<b>public</b> <b>void</b> setProjectId(String projectId) {
<b>this</b>.projectId = projectId;
}
<b>public</b> String getProjectName() {
<b>return</b> projectName;
}
<b>public</b> <b>void</b> setProjectName(String projectName) {
<b>this</b>.projectName = projectName;
}
<b>public</b> String getProjectDesc() {
<b>return</b> projectDesc;
}
<b>public</b> <b>void</b> setProjectDesc(String projectDesc) {
<b>this</b>.projectDesc = projectDesc;
}
}
第3步: 实现传输对象组装程序。
在此处组装ProjectDetailsData对象的ProjectDetailsAssembler类。
<b>public</b> <b>class</b> ProjectDetailsAssembler {
<b>public</b> ProjectDetailsData getData(String projectId) {
<font><i>// Construct the composite transfer object</i></font><font>
</font><font><i>// get project related information from database and set to ProjectDetailsData class object.</i></font><font>
ProjectTO projectData = <b>new</b> ProjectTO();
</font><font><i>// get ProjectManager info and add to ProjectDetailsData</i></font><font>
ProjectManagerTO projectManagerData = <b>new</b> ProjectManagerTO();
</font><font><i>// construct a new TaskResourceTO using Task and Resource data.</i></font><font>
</font><font><i>//get the Resource details from database.</i></font><font>
</font><font><i>// construct a list of TaskResourceTOs</i></font><font>
Collection < TaskResourceTO > listOfTasks = <b>new</b> ArrayList < > ();
</font><font><i>// Add Project Info to ProjectDetailsData</i></font><font>
</font><font><i>// Add ProjectManager info to ProjectDetailsData</i></font><font>
ProjectDetailsData pData = <b>new</b> ProjectDetailsData(projectData, projectManagerData, listOfTasks);
<b>return</b> pData;
}
}
</font>
后果
- 分离业务逻辑,简化客户端逻辑
- 减少客户端和应用程序模型之间的耦合
- 提高网络性能
- 提高客户端性能
- 可以引入过期的数据
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- NIEM IEPD: 组装 IEPD
- 阿里开源组装式 Flutter 应用框架 Fish Redux
- [译]LLVM每日谈之四十一 组装一个完整的工具链
- Smarty 3.1.32 修复路径组装方式中可能存在的安全漏洞
- 想要组装一台 RISC-V PC?试试这个 RISC-V 开发板
- 东进量子加密传输网关:为数据传输套上“金钟罩”
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
自制编程语言 基于C语言
郑钢 / 人民邮电出版社 / 2018-9-1 / CNY 89.00
本书是一本专门介绍自制编程语言的图书,书中深入浅出地讲述了如何开发一门编程语言,以及运行这门编程语言的虚拟机。本书主要内容包括:脚本语言的功能、词法分析器、类、对象、原生方法、自上而下算符优先、语法分析、语义分析、虚拟机、内建类、垃圾回收、命令行及调试等技术。 本书适合程序员阅读,也适合对编程语言原理感兴趣的计算机从业人员学习。一起来看看 《自制编程语言 基于C语言》 这本书的介绍吧!