有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于组装分散数据的java设计模式?

我正在设计一个系统,它将分散数据组装成标准的行/列类型输出

每列可以:

  • 存在于一个独立的系统中
  • 可以分页
  • 可以排序
  • 每列可以包含数百万行

以及该系统:

  • 需要可扩展,以便可以输出不同列的不同表
  • 最后一个域对象是已知的(行)
  • 所有系统中的键都是恒定的

我当前的实现计划是每列设计两个类(或者一个类列实现两个接口)。这些接口将:

  1. 实现分页和排序
  2. 实施“装饰”

其思想是,表构造函数将接收有关当前排序列和页面的信息。然后返回表的相应键的列表。此信息将用于创建域对象行的列表,然后依次传递给每个列“装饰”实现,以便依次添加每个列的信息

我想我的问题是——推荐什么样的设计模式——或者人们会使用其他设计决策来使用公共键和变量列组合分散数据


共 (1) 个答案

  1. # 1 楼答案

    我不确定我是否完全理解了您要做的事情,但从我收集的信息来看,您希望以一种允许您以后从中创建结构化表的方式存储任意数据行。在这种情况下(假设您使用的是Java),我要做的是创建一个非常简单的Column接口,该接口只有一个“value”属性:

    public interface Column {
        String value;
    }
    

    然后,您可以通过实现Column来创建列:

    public class Key implements Column {
        String value = new String();
    
        public Key(String keyValue){
            this.value = keyValue;
        }
    }
    

    因此,您可以创建一个名为DataRow(或任何您喜欢的)的类,其对象将包含实际数据。例如,您可以在该类中有一个允许您添加数据的方法:

    public class DataRow {
    
        List<Column> data = new ArrayList<Column>();
    
        public DataRow(String key){
            this.setColumn(new Key(key));
        }
    
        public void setColumn(Column columnData) {
            this.data.add(columnData);
        }
    
        public Column getColumn(Class column){
            for(Column c : this.data){
                if(c.getClass().equals(column)){
                    return c;
                }
            }
            return null;
        }
    
    }
    

    如您所见,您可以通过给方法setColumn()一个新的Column对象来调用它。这将允许您向DataRow对象添加任何类型的数据。然后,为了生成一些表,您可以使用一个函数,该函数接受ListDataRowsList个类,然后只返回具有指定行数据的对象:

    public List<DataRow> createTable(List<DataRow> data, List<Class<? extends Column>> columns){
        List<DataRow> table = new ArrayList<DataRow>();
        for(DataRow row : data){
            DataRow ret = new DataRow(row.getColumn(Key.class).value);
            for(Class column : columns){
                if(row.getColumn(column.getClass()) != null )ret.setColumn(row.getColumn(column.getClass()));
            }
            table.add(ret);
        }
        return table;
    }
    

    这将允许您使用数据和要包含在表中的列“创建”表

    请注意,我写这段代码是为了传达一个想法,现在它相当混乱。但我希望这能在某种程度上帮助你