Java 低耦合的复杂对象创建

Java 低耦合的复杂对象创建,java,spring,Java,Spring,叶节点需要外部依赖的复杂对象创建的设计问题(Java、Spring)。当您有一个复杂的对象,并且需要一些服务来创建对象图的某些部分时,有什么好的方法来构建这样的对象 给定以下用于生成某种报告的功能和类结构,其中LineItem.description需要由Purchase.key(要显示的正常本地化消息)解析 类报告服务{ 报告构建报告(请求、设置购买){ …根据请求和购买生成并返回逻辑报告。。。 } } 课堂报告{ 收割台 报告主体 } 类报告体{ 清单项目 } 类别行项目{ //局部化描述

叶节点需要外部依赖的复杂对象创建的设计问题(Java、Spring)。当您有一个复杂的对象,并且需要一些服务来创建对象图的某些部分时,有什么好的方法来构建这样的对象

给定以下用于生成某种报告的功能和类结构,其中LineItem.description需要由Purchase.key(要显示的正常本地化消息)解析

类报告服务{
报告构建报告(请求、设置购买){
…根据请求和购买生成并返回逻辑报告。。。
}
}
课堂报告{
收割台
报告主体
}
类报告体{
清单项目
}
类别行项目{
//局部化描述
字符串描述
}
班级购买{
字符串类型
串键
}
//用于解析消息的服务。
类消息源{
//返回使用给定键找到的本地化消息文本
字符串消息(字符串键,区域设置){}
}
实施报告结构的优雅方式是什么

我想到的备选方案是:

  • 在ReportService(或某些生成器/工厂类)中构造整个对象,并将MessageSource注入ReportService。这种方法的问题是ReportService与报表的整个对象图及其内部结构高度耦合,需要构建子对象所需的所有服务
  • 让每个班级的报告对其孩子负责。所以ReportService只会: 返回新报告(请求、购买) 否则,这似乎是一种很好的方法,因为父对象只知道其直接子对象,但我们无法解析LineItem描述。我们需要将MessageSource(以及可能的多个其他服务)传递给POJO。直接向POJO注入服务听起来不合理
那么,您将如何实现这一点?还要考虑容易进行单元测试。

class ReportService {

    Report buildReport(Request request, Set<Purchase> purchases) {

        ... build and return Report with logic based on request and purchases ...

    }

}

class Report {
    Header header
    ReportBody body

}

class ReportBody {
    List<LineItem> items
}

class LineItem {
    // Locallized escription
    String description

}

class Purchase {
    String type
    String key
}


// Service used to resolve the message. 
class MessageSource {
    // Return locallized message text found with the given key
    String message(String key, Locale locale) { }
}