在学习面向对象设计的同时,我批判性地判断自己的设计。这个框架应该能够打印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());
}
}
答案 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进行解析。