我的应用程序中有一个数据库层。在我的正面,有一些图形可以显示用户。我从数据库中获取必要的数据,并在网站上显示该数据。当我从数据库中获取原始数据时,我将处理我使用的API数据(highcharts等)。我设计了这样的东西:

ChartDTO


所有图表实现的主界面。具有如下方法:

public Object getTotalUsersPieChart(DatabaseData databaseData);




HighChartsDTOImpl


ChartDTO的实现。它的所有方法都返回对象类型变量。

在客户端,我直接用来自服务器端的数据输入图形,而无需在客户端进行任何预处理。

我的问题是:
我知道这里有一个设计错误,也许不是DTO设计(至少我的架构如此)

我该如何设计这种情况?

最佳答案

我建议您使用某种Factory模式。
您应该向客户传递要创建的图表类型的“提示”,
并让ChartFactory为您创建它。
这是一个代码片段:

public class ChartFactory {

    public Chart createChart(ChartType, ChartParameters params) {
       Chart chart = ... //Creates a chart object based on type and ChartParameters
       return chart;
    }
}


您可以将此工厂设置为Singleton,因此,如果需要进行一些工厂初始化,则只需执行一次。
ChartParameters应该包含用于创建特定图表类型的对象的参数。
它可以是键和值的简单映射,即:

public class ChartParameters {
    private Map<String,Object> params = new HashMap<String,Object>();

    public Object getParam(String paramName) {
        return params.get(paramName);
    }

    //Add here more methods... maybe a CTOR that takes a map of params,
    //And a method to add a parameter
}


或者这可以有另一个实现。
您还可以决定为Chart的每个子类都有一个参数类(所有这些参数类都将扩展ChartParameters),
但这可能会导致您在继承树上进行某种形式的复制。
最后,
这样,您需要发送给客户端的只是图表类型和参数,它将实例化该适当的图表对象。

09-11 19:59
查看更多