传输对象组装器模式


使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。
问题
您希望获得一个聚合来自多个业务组件的传输对象的应用程序模型。

动因

  • 您希望以集中方式封装业务逻辑,并防止在客户端中实现它。
  • 您希望在构建业务层对象模型的数据表示时,对远程对象的网络调用最小化。
  • 您希望创建一个复杂的模型以交给客户端以进行演示。
  • 您希望客户端独立于模型实现的复杂性,并且希望减少客户端与业务组件之间的耦合。

解决方案
使用传输对象组装程序将应用程序模型构建为复合传输对象。传输对象组装器聚合来自各种业务组件和服务的多个传输对象,并将其返回给客户端。

结构
让我们使用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;
    }
}


后果

  • 分离业务逻辑,简化客户端逻辑
  • 减少客户端和应用程序模型之间的耦合
  • 提高网络性能
  • 提高客户端性能
  • 可以引入过期的数据