使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
问题
您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。
动因
- 您希望以集中方式封装业务逻辑,并防止在客户端中实现它。
- 您希望在构建业务层对象模型的数据表示时,对远程对象的网络调用最小化。
- 您希望创建一个复杂的模型以交给客户端以进行演示。
- 您希望客户端独立于模型实现的复杂性,并且希望减少客户端与业务组件之间的耦合。
解决方案
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。结构
让我们使用UML类图来显示解决方案的基本结构,本节中的UML序列图介绍了解决方案的动态机制。
类图
序列图
参与者与职责
客户端 - 客户端调用TransferObjectAssembler以获取应用程序模型数据。客户端可以是表示层的组件,也可以是会话面,为访问TransferObjectAssembler的客户端提供远程访问层。
TransferObjectAssembler - TransferObjectAssembler是此模式的主要类。当客户端请求应用程序模型数据时,TransferObjectAssembler根据应用程序的要求构造一个新的复合传输对象。
ApplicationModel- ApplicationModel对象是由TransferObjectAssembler构造并返回到客户端的复合传输对象。
BusinessObject- BusinessObject表示业务对象,它向TransferObjectAssembler提供传输对象以组装应用程序模型。
SessionFacade - 该SessionFacade表示会话外观,它提供了构建applicationmodel传输对象所需的部分数据。
DataAccessObject - DataAccessObject表示数据访问对象,当TransferObjectAssembler需要直接从持久存储中获取数据时使用。
Service - 服务是任意服务对象,包括业务层中的应用程序服务,它提供构造ApplicationModel对象所需的数据。
实现传输对象汇编程序
考虑一个 项目管理应用程序 ,其中许多业务层组件定义了复杂模型。假设客户想要获取模型
数据来自于各种业务对象的数据组合,例如:
- 项目组件的项目信息
- ProjectManager组件中的 项目经理信息
- 项目组件中 的项目任务列表
- 资源组件中的资源信息。
第1步:创建复合传输对象类
可以实现一个传输对象组装器模式来组装该复合传输对象。
public class ProjectDetailsData { private ProjectTO projectData; private ProjectManagerTO projectManagerData; private Collection < TaskResourceTO > listOfTasks;
public ProjectDetailsData(ProjectTO projectData, ProjectManagerTO projectManagerData, Collection < TaskResourceTO > listOfTasks) { super(); this.projectData = projectData; this.projectManagerData = projectManagerData; this.listOfTasks = listOfTasks; } }
|
ProjectDetailsData中的任务列表是TaskResourceTo对象的集合。taskResourceTo是taskTo和resourceTo的组合。
第2步:创建ResourceTo、TaskTo、ProjectTo和ProjectManager以传输对象类。
public class ResourceTO { private String resourceId; private String resourceName; private String resourceEmail; public String getResourceId() { return resourceId; } public void setResourceId(String resourceId) { this.resourceId = resourceId; } public String getResourceName() { return resourceName; } public void setResourceName(String resourceName) { this.resourceName = resourceName; } public String getResourceEmail() { return resourceEmail; } public void setResourceEmail(String resourceEmail) { this.resourceEmail = resourceEmail; } }
|
public class TaskTO { private String projectId; private String taskId; private String name; private String description; private Date startDate; private Date endDate; private String assignedResourceId; public String getProjectId() { return projectId; } public void setProjectId(String projectId) { this.projectId = projectId; } public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public String getAssignedResourceId() { return assignedResourceId; } public void setAssignedResourceId(String assignedResourceId) { this.assignedResourceId = assignedResourceId; } }
|
public class TaskResourceTO { private String projectId; private String taskId; private String name; private String description; private Date startDate; private Date endDate; private TaskResourceTO assignedResource; public String getProjectId() { return projectId; } public void setProjectId(String projectId) { this.projectId = projectId; } public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public TaskResourceTO getAssignedResource() { return assignedResource; } public void setAssignedResource(TaskResourceTO assignedResource) { this.assignedResource = assignedResource; } }
|
public class ProjectManagerTO {
private String name; private String address; private String projects; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getProjects() { return projects; } public void setProjects(String projects) { this.projects = projects; }
}
|
public class ProjectTO {
private String projectId; private String projectName; private String projectDesc; public String getProjectId() { return projectId; } public void setProjectId(String projectId) { this.projectId = projectId; } public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } public String getProjectDesc() { return projectDesc; } public void setProjectDesc(String projectDesc) { this.projectDesc = projectDesc; } }
|
第3步:实现传输对象组装程序。
在此处组装ProjectDetailsData对象的ProjectDetailsAssembler类。
public class ProjectDetailsAssembler {
public ProjectDetailsData getData(String projectId) {
// Construct the composite transfer object // get project related information from database and set to ProjectDetailsData class object. ProjectTO projectData = new ProjectTO();
// get ProjectManager info and add to ProjectDetailsData ProjectManagerTO projectManagerData = new ProjectManagerTO();
// construct a new TaskResourceTO using Task and Resource data. //get the Resource details from database. // construct a list of TaskResourceTOs Collection < TaskResourceTO > listOfTasks = new ArrayList < > ();
// Add Project Info to ProjectDetailsData // Add ProjectManager info to ProjectDetailsData ProjectDetailsData pData = new ProjectDetailsData(projectData, projectManagerData, listOfTasks); return pData; } }
|
后果
- 分离业务逻辑,简化客户端逻辑
- 减少客户端和应用程序模型之间的耦合
- 提高网络性能
- 提高客户端性能
- 可以引入过期的数据