【发布时间】:2016-12-11 01:44:45
【问题描述】:
我有各种类型的事件,如下所示。一般来说,我有更多的活动。
EventA
EventB
EventC
EventD
EventE
下面是我将获取每种事件类型的代码:
public void run() {
try {
while (!closed.get()) {
ConsumerRecords records = consumer.poll(10000);
// Handle new records
for (ConsumerRecord<String, String> record : records) {
GenericRecord payload = decoder.decode(record.value());
String eventType = String.valueOf(payload.get("eventType"));
String eventMapHolder = String.valueOf(payload.get("eventMapHolder"));
Map<String, String> eventHolder = parseStringToMap(eventHolder);
// here eventType will "EventA", "EventB" and so on
// pass eventType to get the individual factory for that event type
// and then pass eventHolder to a particular method of that factory class which calls appropriate Query method.
}
}
} catch (Exception e) {
// log error
}
}
对于每个事件,我需要执行不同的数据库查询,但至少对于大多数事件,我需要执行一个对所有事件都通用的数据库查询。例如:
EventA -----> QueryA, QueryB
EventB -----> QueryA
EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
以下是流程:
EventA -----> QueryA, QueryB
EventB -----> QueryA
eventHolder EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
- 假设我在问题中的代码中将“EventA”作为 eventType,然后我会将 eventHolder Map 传递给一个方法(我们将其称为 QueryA)并在该方法中对此进行一些操作地图并返回一个新地图。然后这个新 Map 将被传递给另一个方法(我们称之为 QueryB),然后我们将再次对其进行一些操作,然后返回另一个 Map,然后该映射将返回给调用者。
- 现在假设“EventB”在我的问题中的代码中作为 eventType 出现,然后我会将 eventHolder Map 传递给一个方法(我们将其称为 QueryA)并在该方法中,我将在此地图上执行一些操作并返回一个新地图。然后这个地图将被传回给调用者。
- 现在假设“EventE”在我的问题中的代码中作为 eventType 出现,然后我会将 eventHolder Map 传递给 EventE 类,并且由于在这种情况下我们无需做任何事情,那么我将传递此映射因为它返回给调用者。
问题:
我应该使用哪种设计模式来解决这类问题?我想避免使用 if/else 或在此处切换 bcoz 通常我有很多事件类型,因此考虑为它们创建一个单独的工厂,我们可以通过传递 eventType 值在运行时动态加载它。
我事先知道所有的 eventType,因此我可以通过将其放入地图来静态初始化所有工厂,然后在我们运行代码时一旦 eventType 出现,我就可以从地图中加载各个工厂。
如果这是解决此问题的正确设计模式,我如何在此处使用抽象工厂模式来完成此任务?我想将 "eventType" 作为密钥传递给工厂,该工厂将返回该事件类型的实例。因此,假设我将"EventA" 传递给工厂,然后它将返回"EventA" 的工厂类,然后我们将调用该类的特定方法,该方法在内部调用 QueryA 方法,然后我们调用 QueryB 方法,最后它将返回 Map,我将在上面的代码中将其打印出来。对于其他事件类型也是如此。
我在此基础上考虑了一些事情:我不确定工厂模式是否完全可行,或者可能是其他一些设计模式。 (我的命名约定可能搞砸了,我只是想出了下面的名字)
EventFactory eventFactory = EventTypeFactory.getInstance().getFactory(eventType);
Map<String, String> holder = eventFactory.execute(eventHolder);
【问题讨论】:
-
我知道一种非常 oop 的方式来做到这一点,而无需使用 if-else 或 switch,但不记得了。也许在早上睡个好觉之后。
-
返回地图的目的是什么?
标签: java design-patterns interface factory-pattern abstract-factory