2013-04-21 66 views
1

我有下面的使用情况,我得到的事件包含JsonString1,我不得不做一些处理/转换到Object1通过对象4.截至目前,我只有一个这样的案件和它的很可能在将来会出现更多这样的层次结构(最多2-3层)。Java设计模式/转换模式

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

 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)

我是否适应这样的变化,以及通过串变换提供的接口,或者它这是一种矫枉过正?

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

谢谢

+0

你可以举个例子,你正在努力实现的目标(输入 - >输出 - >变换) ? – 2013-04-21 18:54:46

回答

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

    } 
}