簡體   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