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

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

一个基本的假设是,由于我们无法控制POJO的生成并按原样接收集合,因此无法使用适当的处理程序来装饰POJO。因此,任何对此的机制都属于同一陷阱。但是,项目3 stil处理这种可能性。

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


最明显,最丑陋的解决方案是使用instanceOf运算符将POJO传递给处理程序。
对1的更好修改是对链式调度程序使用责任链,以便新类型只需要一个新调度程序。但是,每个调度程序仍然需要instanceOf。
创建增强的对象,而不是POJOS,其中每个对象都包含对其处理程序的引用。这在POJO和我们的处理器之间建立了耦合。
创建一个调度程序服务(我知道如何用Java正确地做到这一点),该服务将处理程序注册到特定的事件类,并使用泛型(Typesafe容器,如有效的Java)将事件调度到处理程序。


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

最佳答案

简化#4:

使用Map存储每个事件类的处理程序。

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);


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

07-24 09:38
查看更多