代码之家  ›  专栏  ›  技术社区  ›  user44242

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

  •  2
  • user44242  · 技术社区  · 17 年前

    我试图为下面的问题找到一个优雅的OOP解决方案。

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

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

    1. 对1的一个稍微好一点的修改是使用责任链,使用链式dispatcher,这样新类型只需要一个新的dispatcher。但是,每个调度器仍然需要instanceOf。
    2. 创建增强的对象,而不是POJO,其中每个对象都持有对其处理程序的引用。这在POJO和处理器之间创建了一个耦合。

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

    5 回复  |  直到 17 年前
        1
  •  4
  •   Bombe    17 年前

    简化#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);
    

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

        2
  •  1
  •   tpdi    17 年前

    如果POJO的类是稳定的(新的),恭喜您 类类型 (不经常添加)您刚刚描述了使用访问者模式的动机!

    可能 要对您的POJO集合执行不同的操作,您可以创建AbstractBaseVisitor并扩展它以处理您需要执行的不同操作!

    这将需要在每个POJO周围放置一个小包装器,每个POJO类有一个包装器类,以添加 visit() 调用访问者的函数。

        3
  •  0
  •   Bhushan Bhangale    17 年前

    我在这个场景中使用了第4个解决方案,我认为这是一个很好的解决方案。我还将寻求关于更好解决方案的其他意见。

        4
  •  0
  •   Mike Reedell    17 年前

    另一个解决方案是:用它的dispatcher方法注释每个类。您不需要一个中心位置来处理调度程序调用,POJO/调度程序也不会耦合到注释之外。

        5
  •  0
  •   waxwing    17 年前

    这个问题实际上根本不是语言不可知论。在某些语言中,您可以轻松地装饰类。但让我们继续使用Java。即使在那里,我也会说“视情况而定”。

    如果您在Spring这样的上下文中运行,则会出现一个更有趣的选项。您可以获得实现特定接口的所有bean,例如:

    public interface Handler<T> {
        void handle(T object);
    }
    

    Collection<Handler> handlers = applicationContext.getBeansofType(Handler.class).values();
    for (Handler handler : handlers) {
        Method handleMethod = handler.getClass().getMethod("handle", Object.class);
        Class<?> type = handleMethod.getParameterTypes()[0];
        register(type, handler);
    }
    

    (无可否认,上述代码未经测试)

    我意识到我超越了这里的界限。我的观点是,解决方案的优雅程度取决于您选择的语言、您愿意使用的外部工具以及您正在使用的框架。

    推荐文章