gpt4 book ai didi

java - 如何从 map 动态加载工厂模式?

转载 作者:行者123 更新时间:2023-11-30 07:00:00 25 4
gpt4 key购买 nike

我有各种类型的事件,如下所示。一般来说,我有更多的 Activity 。

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),并在该方法中,我将在此映射上执行一些操作并返回一个新的 map 。然后这张 map 将被传回给调用者。
  • 现在假设“EventE”在我的问题代码中作为 eventType 出现,那么我将把 eventHolder Map 传递给 EventE 类,并且由于我们无需为此情况执行任何操作,那么我将传递此映射因为它返回给调用者。

问题:

对于这种问题我应该使用哪种设计模式?我想避免使用 if/else 或在这里切换,因为一般来说我有很多事件类型,因此考虑为它们创建一个单独的工厂,我们可以通过传递 eventType 值在运行时动态加载它。

我事先知道所有的事件类型,因此我可以通过将其放入映射中来静态初始化所有工厂,然后在运行代码时一旦事件类型出现,我就可以从映射中加载各个工厂。

如果这是解决这个问题的正确设计模式,我如何在这里使用抽象工厂模式来完成这个任务?我想将“eventType”作为 key 传递给工厂,该工厂将返回该事件类型的实例。假设我将 "EventA" 传递给工厂,然后它将返回 "EventA" 的工厂类,然后我们将在该类上调用一个特定的方法,该方法在内部调用 QueryA 方法,然后调用 QueryB 方法,最后它将返回 Map,我将在上面的代码中将其打印出来。对于其他事件类型也是如此。

我在考虑这个问题:我不确定这对于工厂模式是否可行,或者可能是其他一些设计模式。 (我的命名约定可能会困惑,我只是想出了以下名称)

EventFactory eventFactory = EventTypeFactory.getInstance().getFactory(eventType);
Map<String, String> holder = eventFactory.execute(eventHolder);

最佳答案

嗯,这个问题有两个主要目标。

  • 引入并重复使用自定义查询逻辑。
  • 动态地将 eventType String 映射到相关的查询操作。

首先,我希望您采用 Interpreter 的变体图案。所以它看起来像这样。

public interface Query{
public Map<String, String> execute(Map<String, String> map);
}

@Singleton
public class QueryA implements Query{
@Override
public Map<String, String> execute(Map<String, String> map){
//queryA logic.
}
}

public class CustomQuery implements Query{
List<Query> queryList;

public void CustomQuery(List<Query> queries){
this.queryList = queries;
}

public void CustomQuery(Query query1, Query query2){
this.queryList = new ArrayList();
queryList.add(query1);
queryList.add(query2);
}

@Override
public Map<String, String> execute(Map<String, String> map){
if(queryList == null){
return map;
}

Map<String, String> eventMap = map;
for(Query query: queryList){
eventMap = query.execute(eventMap);
}
return eventMap;
}
}

请注意,每个子查询类(例如:QueryA)应该单例以避免内存不足打印。使用上面的内容我们可以自定义查询操作。

例如:QueryAB(事件A的需要)

@Inject
QueryA queryA;
@Inject
QueryB queryB;
Query queryAB = new CustomQuery(queryA, queryB);

现在您可以拥有 Map<String, Query> eventToQueryMap它动态映射您的EventType必要的查询逻辑

例如:

Map<String, Query> eventToQueryMap = new HashMap();
eventToQueryMap.put("EventA", queryAB);
eventToQueryMap.put("EventB", queryA);
//like above you can add for others too.

然后,每当您收到 eventType 字符串时,您都想做的就是。

Map<String, String> eventMap = eventToQueryMap.get(eventType).execute(eventHolder);

这是您遇到的主要问题的概要解决方案。您可以自己添加自定义。 :))

关于java - 如何从 map 动态加载工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com