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

The*_*Cat 4 java object-oriented-analysis

我正在创建一个程序,其中我有称为"层次结构"的对象,它只是带有ArrayList<ArrayList<String>>带适当getter的strings()的列表列表.

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

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

感谢您的任何指示/提示/答案.

Tom*_*icz 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) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这被称为战略设计模式.如果某些代码需要格式化您的层次结构,只需传递一个实例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() {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

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