我有以下用例,其中我获取包含 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() {
}
}
类似的实现会带来更多事件。
有更好的方法吗?
目前有两件事是不变的,但在极少数情况下可能会发生变化。
- 所有事件都会有 JsonString1 .. JsonString4 但最后的对象数量会有所不同。但将来这种情况可能会改变。
- 虽然字符串的格式不太可能(但并非不可能)发生变化(例如从 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/