java - 使用混合 POJOS 处理集合,每个 POJO 使用不同的处理程序

标签 java language-agnostic design-patterns

我正在尝试为以下问题找到一个优雅的 OOP 解决方案。

假设我们有一个 POJOS 的集合,在本例中是事件,其中每个 POJO 可能是不同的类。我们需要对每个 POJO 类(或类型)使用不同的规则来处理这个集合。

一个基本假设是,我们无法使用适当的处理程序来装饰 POJO,因为我们无法控制它们的生成,并且按原样接收集合。因此,任何机制都会落入同样的陷阱。然而,第 3 条仍然涉及这种可能性。

有一些可能的解决方案,有些非常丑陋,有些更优雅但复杂:

  1. 最明显也是最丑陋的解决方案是使用 instanceOf 运算符将 POJO 传递给处理程序。
  2. 对 1 的一个稍微更好的修改是使用责任链和链式调度程序,以便新类型只需要一个新的调度程序。然而,每个调度程序仍然需要instanceOf。
  3. 创建增强对象,而不是 POJOS,其中每个对象都保存对其处理程序的引用。这会在 POJO 和我们的处理器之间创建耦合。
  4. 创建(我知道如何在Java中正确执行此操作)一个调度程序服务,该服务将处理程序注册到特定的事件类,并使用泛型(类型安全容器,如有效的java中)将事件调度到处理程序。

4是最优雅的,但我想知道是否有更好的想法。

最佳答案

#4 的简化:

使用映射来存储每个事件类的处理程序。

Map<Class, Handler> classHandlers = new HashMap<Class, Handler>();
classHandlers.put(EventA.class, new EventAHandler());
classHandlers.put(EventB.class, new EventBHandler());

现在使用事件的类来获取事件的处理程序。

Handler handler = classHandlers.get(event.getClass());
handler.handle(event);

当然,这需要在编码时了解所有可能的事件类,因此不如外部事件调度程序灵活。

关于java - 使用混合 POJOS 处理集合,每个 POJO 使用不同的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771995/

相关文章:

java - Java 中的 MongoDB 日期搜索返回零结果

java - 尝试使用 @ManyToOne 映射来持久化实体

java - 如何在android中使用pocketsphinx进行多个关键字激活而无需进入菜单

nhibernate - CQRS - 查询端

c# - 我在寻找哪种模式?

java - 如何使用 Apache Camel、java DSL、eclipse 更改 XML 文件的内容

language-agnostic - 条件随机场——它们是如何工作的?

language-agnostic - 哪种设计模式乍看之下最可怕,但实现后却是最美丽的?

language-agnostic - 如何有效地在数据库中存储大量行

java - 带有 DAO/VO 的 MVC - Controller 应该与哪个 DAO 对话?