繁体   English   中英

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

[英]Improve design of class hierarchy for a object formatter api

在学习面向对象的设计时,我会严格地评估自己的设计。 这个框架应该能够以XML或JSON格式打印对象,我已经在一个基本实现中进行了存根,以避免现在进入XML和Json解析器api的详细信息。

因此,我将Formatter设为基类。 但是在我当前的设计中,该基类的所有派生类都需要知道它们必须调用: getFormattedValue()来获取输出。 另外,我对Formatter构造函数中的所有if else语句都不满意。 客户需要知道在此类的所有派生类中传递“ 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());
    }
}

将格式拆分为多个类/接口,并使用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");

我不能为getFormattedValue()推荐任何东西,您可能可以更改方法名称以使其更明显,但是仅此而已。

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

public Enum EnumFormatType {
    FORMAT_XML, FORMAT_JSON;
}

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

我将从提供一个抽象类进行格式化开始。

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

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

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

现在,您只需选择所需的格式化程序,然后对其中任何一个调用format以获取正确的字符串。

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

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通过代码或配置来解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM