如何设计一个可以是两种类型之一的对象?

Jac*_*ine 1 java oop

我正在阅读HTTP POST,HTTP请求的主体可以是JSON或XML.现在我已将读取委托给一个特殊的实用程序类.

interface HttpUtils
{
    BodyWrapper parseBody( HttpServletRequest req );
}

interface BodyWrapper
{
    boolean isXML();  // 1
    boolean isJSON(); // 2
    String body();    // 3
}
Run Code Online (Sandbox Code Playgroud)
  • 我讨厌BodyWrapper有方法(1和2)来识别它的类型.也许我应该使用继承.如果我这样做,我将需要做一个instanceof来找出HttpUtils.parseBody(..)返回的内容
  • 理想情况下,我还希望body()方法返回JSONObject或DOM节点.我该怎么办?

Bri*_*new 8

不要向对象询问信息,然后就他们告诉您的内容做出决定.让您的对象为您完成工作.也就是说,不要这样做:

if (body.isXML()) {
  // do XML stuff
}
else if (body.isJSON()) {
  // do JSON stuff
}
Run Code Online (Sandbox Code Playgroud)

这是一个维护问题.做这样的事情(BodyWrapper实现将使用抽象工厂方法或类似方法创建)

public interface BodyWrapper {
   Object doStuff();
}

public class DOMBodyWrapper implements BodyWrapper {
   public Object doStuff() {
   }
}

public class JSONBodyWrapper implements BodyWrapper {
   public Object doStuff() {
      // do something and return a success/failure result. I've
      // deliberately not defined what this object is....
   }
}
Run Code Online (Sandbox Code Playgroud)

然后:

// get the body via a factory or similar
body.doStuff();
Run Code Online (Sandbox Code Playgroud)

这样,某些东西会创建适当的BodyWrapper实现,然后不再询问它是什么类型,而只是使用它.请注意,BodyWrapper不会返回不同类型的内部结构,因为它(可能是一个抽象基类)正在为您完成工作.