内容简介:使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
问题
您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。
动因
- 您希望以集中方式封装业务逻辑,并防止在客户端中实现它。
- 您希望在构建业务层对象模型的数据表示时,对远程对象的网络调用最小化。
- 您希望创建一个复杂的模型以交给客户端以进行演示。
- 您希望客户端独立于模型实现的复杂性,并且希望减少客户端与业务组件之间的耦合。
解决方案
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
结构
让我们使用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 开发板
- 东进量子加密传输网关:为数据传输套上“金钟罩”
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
软件预构艺术(中文版)
Ken Pugh / O'Reilly Taiwan公司 / 东南大学 / 2010-6 / 26.00元
利用经验累积而得到的洞察力开发新的解决方案被称为预构。透过重构而获得的专业知识也属于这类经验,而预构的词源即重构。重构是修改程序或软件系统内部结构的实践,以此在保留其现有行为的基础上改良设计。重构的原因有多种:方便后期增加功能、提高可维护性、提升性能。 本书作者是经验老道的软件开发人员。书中,作者运用他个人和其他众多开发人员的丰富经验,展示由其推衍而得的各项实践方针。这些方针把优秀的开发人员......一起来看看 《软件预构艺术(中文版)》 这本书的介绍吧!