[英]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.