改进对象格式化程序api的类层次结构设计

时间:2014-08-19 10:15:03

标签: java oop design-patterns object-oriented-analysis

在学习面向对象设计的同时,我批判性地判断自己的设计。这个框架应该能够打印XML或JSON中的对象,我已经在基本实现中存根,以避免现在进入XML和Json解析器apis的细节。

所以我让Formatter成为基类。但是根据我目前的设计,这个基类的所有衍生物都需要知道他们必须调用:getFormattedValue()来获得输出。此外,我对if else构造函数中的所有Formatter语句感到不舒服。客户需要知道传入" xml"或" json"在这一类的所有衍生物中。如何改进此设计以符合所有面向对象的设计原则?提前谢谢..

public class Formatter {

    private String output;

    public Formatter(Object object, String formatType){
        if(formatType.equals("xml")){
            output = getXMLFormat(object);
        } else if(formatType.equals("json")) {
            output = getJSONFormat(object);
        }
    }

    private String getXMLFormat(Object object){

        return "<title>"+object.toString()+"<title>"; // simplified
    }

    private String getJSONFormat(Object object){
        return "{"+object.toString()+"}"; // simplified
    }

   protected  String getFormattedValue(){
        return output;
    }
}

派生类:

public class ItemFormatter extends Formatter {

    public ItemFormatter(Employee item, String formatOutput) {
        super(item, formatOutput);
    }

    public void printItem(){
        System.out.println(getFormattedValue());
    }
}

4 个答案:

答案 0 :(得分:2)

将格式拆分为多个类/接口,并使用Factory / Factory方法获取相应的格式化程序。它可能看起来像这样:

public interface Formatter {
    String getFormattedValue();
}

并实现JSonFormatter:

public class JSonFormatter implements Formatter {
    String getFormattedValue(Object object) {
        return "{"+object.toString()+"}";
    }
}

获取正确的格式化程序:

public class FormatterFactory {
    public static Formatter getFormatter(String type) { // maybe use enum to decide
        if (type.equals("json") {
            return new JSonFormatter();
        } else if (type.equals("xml")) {
            return new XMLFormatter();
        }
        return new DefaultFormatter(); // returns toString for example
    }
}

最后用法:

String formattedXML = FormatterFactory.getFormatter("xml").getFormattedValue("foobar");

答案 1 :(得分:0)

我无法为getFormattedValue()推荐任何内容,您可以更改方法名称以使其更加明显,但这是关于它的。

关于xml和json,你可以使用Enums。

public Enum EnumFormatType {
    FORMAT_XML, FORMAT_JSON;
}

public Formatter(Object object, EnumFormatType formatType) {
   if(EnumFormatType.FORMAT_XML.equals(formatType)){
    // etc...
    }
}

答案 2 :(得分:0)

我首先要提供一个抽象类来格式化。

abstract class Formatter {
    String format(Object o);
}

然后我们专门研究两个Formatter for XML和JASON

class XMLFormatter extends Formatter {
    String format(Object o) {
        return "<title>"+o.toString()+"<title>";
    }
}

现在你只需要选择你需要的格式化程序,并在其中任何一个上调用格式以获得正确的字符串。

答案 3 :(得分:0)

我认为以下代码看起来更具可扩展性。

public interface IFormatter 
{
    String GetFormatted(Object object);
}

public class JSonFormatter extends IFormatter 
{
    public String GetFormatted(Object object)
    {
      return "{"+object.toString()+"}";
    }
}

public class XMLFormatter extends IFormatter 
{
    public String GetFormatted(Object object)
    {
        return "<title>"+object.toString()+"<title>";
    }
}

public class ItemFormatter 
{
    public void printItem(Employee item, IFormatter formatter)
    {    
        System.out.println(formatter.GetFormatted(item));
    }
}

它可以被称为

itemFormatterInsatnce.printItem(empInstance, formatterInstance);

格式化程序实例也可以通过代码或配置使用formatterFactory进行解析。