Java设计模式/转换模式

标签 java oop design-patterns

我有以下用例,其中我获取包含 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)

我是否也通过提供字符串转换接口(interface)来适应此类更改,或者这是一种矫枉过正?

通常我会被困在这样的地方,我试图找出最优雅的方法来做到这一点,但最终却花了很多时间?对此还有什么一般性建议吗? :)

谢谢

最佳答案

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

尝试考虑使用装饰器来避免继承 hell 。因此,您可以创建在不久的将来和遥远的将来可能需要的任何组合。在标准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);

    }
}

关于Java设计模式/转换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16132531/

相关文章:

java - 如何解决 Java 错误 "The system cannot find the path specified"?

java - 具有以下限制的方法用什么词表示

oop - 裸机上的面向对象语言

javascript - 仅设置一次模块属性

design-patterns - 如何在不使用静态方法的情况下实现单例?

java - PrepareStatement/Commit 序列在 mysql/HikariCP webapp 中不起作用

java - Android getIntent() 空指针异常

java - 以 java OOP 风格处理 SQL 数据库连接的正确方法

java - 具有两个类层次结构的通用类

java - 如何根据用户提供的字段创建字段?