0

环境

  • 爪哇
  • 春天
  • MVC 模式
  • 休眠

说明

好的,假设我有一个包含两个域对象的 Web 应用程序:

  • 用户
  • 报告

一个用户可以有很多报告(一对多关系)。请考虑报表是一个非常复杂的对象,具有很多属性。

用户等级:

public class User { 
    private Set<Report> reports = new HashSet<Report>();
}

报告类:

public class Report {   
    //...so maaaaaaany attributes
    private String name;
}

假设我需要显示一个 html 页面,该页面显示一个带有相关报告列表的用户配置文件。只有报告的名称出现在列表中。请评论这些注意事项:

  1. 由于内存节省问题,我不认为急切地加载报告,所以我会变得懒惰。
  2. 即使我变得懒惰,关键是我实际上只需要报告的名称。我不想加载大量信息只是为了挑选报告名称!

所以一个可能的解决方案是修改 User 类如下:

public class User { 
    private Set<Report> reports = new HashSet<Report>();
    private List<String> reportNames;
}

从报告中获取所需信息给用户。在我看来,它带来了两个后果:

  1. 报告名称列表必须保持更新
  2. 我打破了对象域之间的分离,用我无法轻松检索的信息填充用户。这种方法甚至可能是有效的,但它非常难看。

那么有没有很好的解决方案来解决这个问题呢?我认为这是开发人员的常见问题。

4

1 回答 1

0

一种方法是使用以下模式:

  • 创建一个视图对象,它代表您想要显示的内容,我们称之为UserViewObject。我不会修改域对象只是为了使它们适应视图,这会破坏 MVC 设计。

  • 在返回列表的服务类中实现服务UserViewObject方法。

  • 让服务方法调用实际完成工作的 DAO 类中的 DAO 方法。

DAO 方法可以确保只读取所需的数据,或者您可以在服务层进行转换。它确实是你喜欢的东西,以及它是如何适应的。但不要让 DAO 层知道你的UserViewObject.

于 2013-07-04T13:26:32.080 回答