gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:32:32 25 4
gpt4 key购买 nike

在学习面向对象设计时,我正在批判性地评判自己的设计。这个框架应该能够以 XML 或 JSON 格式打印对象,我已经在一个基本实现中 stub 了,以避免现在深入了解 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());
}
}

最佳答案

将格式化拆分为多个类/接口(interface),并使用工厂/工厂方法以获得适当的格式化程序。它可能看起来像这样:

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");

关于java - 改进对象格式化程序 API 的类层次结构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com