1

我有以下用例,其中我得到包含 JsonString1 的事件,我必须做一些处理/转换才能通过对象 4 到达对象 1。到目前为止,我只有一个这样的情况,而且将来可能会有更多这样的情况层次结构(最多 2-3 个)。

我无法决定用什么优雅的方式来编码。

        JsonString1
            |
        JsonString2
          /   \
JsonString3  JsonString4
    |            |
 Object1      Object2
                 |
              Object3

我可以有一个抽象类来处理 JsonStrings 1 到 4 以及每种事件类型的具体实现。就像是

public abstract class AbstractEventProcessor {
    public AbstractEventProcessor(String jsonString1) {
         // Do processing to get JsonString2, JsonString3 and JsonString4
    }
}

public class Event1Processor extends AbstractEventProcessor {
    Event1Processor(String str) {
         super(str);
    }
    Object1 getObject1() { 
    }
    Object2 getObject2() { 
    }
    Object3 getObject3() { 
    }
}

类似的实现会随着更多事件的出现而发生。

有一个更好的方法吗 ?

现在还有两件事是不变的,但在极少数情况下可能会改变。

  1. 所有事件都会有 JsonString1 .. JsonString4 但最后的对象数量会有所不同。但在未来,这可能会改变。
  2. 虽然字符串的格式可能会改变(比如从 json 到 xml)不太可能(但并非不可能)

我是否也可以通过为字符串转换提供接口来适应这种变化,或者这是一种矫枉过正的做法?

通常我被困在这样的地方,我试图找出最优雅的方式来做到这一点并最终花费大量时间?对此也有任何一般性建议吗?:)

谢谢

4

1 回答 1

0

目前还不是很清楚你到底想要什么。然而,即使没有它,当我看到你的等级制度时,它也有味道。通常,在我的代码审查期间,每当我看到像你这样的过于花哨的层次结构时,设计中就会出现问题。

尝试考虑使用装饰器来避免继承地狱。因此,您可以创建在不久的将来可能需要的任何组合。从标准 java 类java.io.Reader及其子类中获得一些灵感。

对于您的情况,这意味着这样的事情(至少我如何理解您的描述):

public interface EventProcessor {
    public BaseObject processJsonString(String jsonString);
}

public abstract class AbstractEventProcessor implements EventProcessor {
    final private EventProcessor processor;
    public AbstractEventProcessor(EventProcessor processor) {
        this.processor = processor;
    }
}

public class SpecialObject1 extends/implements BaseObject { ... }
public class SpecialObject2 extends/implements BaseObject { ... }
public class SpecialObject3 extends/implements BaseObject { ... }

// Each your future processor will look like this
public class Event1Processor extends AbstractEventProcessor implements EventProcessor {
    public Event1Processor(EventProcessor processor) {
        super(processor);
    }
    public SpecialObject1 processJsonString(String jsonString) {
        final SpecialObject1 result = (SpecialObject1) super.processJsonString(jsonString);
        // here you add this Event processor specific stuff
        ...
        return result;
    }
    // Maybe more methods here
}

public class Client {
    public void useEventProcessor() {
        final EventProcessor processor1 = new Event1Processor(new Event2Processor(new Event3Processor(null)));
        final SpecialObjectX object1 = processor.processJsonString(jsonString);

        final EventProcessor processor2 = new Event51Processor(new Event20Processor(new Event2Processor(null)));
        final SpecialObjectY object2 = processor2.processJsonString(jsonString);

    }
}
于 2013-11-17T16:44:03.757 回答