在面向对象的设计中保持数据和格式分离

时间:2012-08-19 13:06:30

标签: java object-oriented-analysis

我正在创建一个程序,其中我有一个名为“层次结构”的对象,它只是一个包含字符串(ArrayList<ArrayList<String>>)和适当的getter的列表列表。

用户应该能够选择这些层次结构的表示/格式 - 例如层次结构[1,2,3,4]在写入文件之前是否应表示为{1,2,3,4}或(1-4)或其他任何内容。

是否有一种聪明/标准的方法来进行这种数据和格式分离?我正在考虑创建一个“FormattedHierarchy”对象,它只包含一个Hierarchy-object和一个Formatting-object,但我不知道这是不是一个好的设计选择。

感谢您提供任何指示/提示/答案。

3 个答案:

答案 0 :(得分:6)

您可以做的最糟糕的事情是将层次结构数据表示与格式相结合。层次结构类不应该知道关于格式化的任何。我的建议是创建一个单独的接口HierarchyFormatter,其中有几个不同的实现。

我认为代码值得千言万语:

public interface HierarchyFormatter {
    String format(Hierarchy hierarchy);
}

public class BraceFormatter implements HierarchyFormatter {
    public String format(Hierarchy hierarchy) {
        //...
    }
}

public class RangeFormatter implements HierarchyFormatter {
    public String format(Hierarchy hierarchy) {
        //...
    }
}

这称为strategy design pattern。如果某些代码需要格式化您的层次结构,只需传递HierarchyFormatter的实例 - 任何实例。

如果要使用某种格式永久绑定层次结构,请使格式化程序具有状态:

public abstract class HierarchyFormatter {
    protected final Hierarchy hierarchy;

    public HierarchyFormatter(Hierarchy hierarchy) {
        this.hierarchy = hierarchy;
    }

    public abstract String format();
}

public class BraceFormatter extends HierarchyFormatter {
    public String format() {
        //...
    }
}

public class RangeFormatter extends HierarchyFormatter {
    public String format() {
        //...
    }
}

每次创建格式化程序时,都会将层次结构类封装在其中。

答案 1 :(得分:2)

您可以将其作为模型视图模式进行处理。您的模型是包含实际数据的模型:ArrayList<ArrayList<String>>视图是进行格式化的模式,以各种方式显示数据。那就是格式化类。

答案 2 :(得分:1)

您可以添加类似于标准toString()方法的方法,例如toArrayString()将对象格式化为{1,2,3,4}或toIntervalString(),将其格式化为(1-4)......