首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java设计模式/转换模式

Java设计模式/转换模式
EN

Stack Overflow用户
提问于 2013-04-21 15:01:41
回答 1查看 937关注 0票数 1

在下面的用例中,我得到了包含JsonString1的事件,我必须进行一些处理/转换,才能通过对象4到达Object1。到目前为止,我只有一个这样的案例,而且很可能在将来会有更多这样的层次结构(最高为2-3)。

我无法决定如何用一种优雅的方式对此进行编码。

代码语言:javascript
复制
        JsonString1
            |
        JsonString2
          /   \
JsonString3  JsonString4
    |            |
 Object1      Object2
                 |
              Object3

我只需要一个抽象类来处理JsonStrings 1到4,并对每种类型的事件进行具体的实现。有点像

代码语言:javascript
复制
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)

我是否也可以通过为字符串转换提供接口来适应这样的更改,还是说这是过头了?

通常,我被困在这样的地方,我试图找出最优雅的方法来做这件事,并最终花费了大量的时间?对此也有什么一般性的建议吗?)

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-11-17 16:44:03

你到底想要什么还不太清楚。然而,即使没有它,当我看到你的等级制度,它闻起来。通常,在我的代码评审过程中,每当我看到像您这样的层次结构太花哨时,设计中就会出现一些问题。

试着考虑使用装饰,以避免继承地狱。因此,您可以创建任何组合,您可能需要在近期和遥远的未来。在标准的java类java.io.Reader及其子类中获得一些灵感。

就你的情况而言,这意味着类似的事情(至少我理解你的描述):

代码语言:javascript
复制
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);

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16132531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档