Java设计模式/转换模式

时间:2013-04-21 15:01:42

标签: java oop design-patterns

我有以下用例,我得到包含JsonString1的事件,我必须做一些处理/转换才能通过Object 4到达Object1。到目前为止我只有一个这样的情况并且很可能在将来那里可能会有更多这样的等级制度(最多2-3个)。

我无法决定用这种方式编写代码的优雅方法。

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

我可以有一个Abstract类来处理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)
  3. 我是否也可以通过提供字符串转换接口来适应这些变化,或者这是一种过度杀伤?

    通常我会被困在这样的地方,我试图找出最优雅的方式,并最终花费大量时间?对此有什么一般建议吗? :)

    由于

1 个答案:

答案 0 :(得分: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);

    }
}